가정하자 나는이 같은 같은 코드 :표준 출력 순서
main() {
start thread;
put data in task queue;
do some stuff
wait for data in result queue;
printf ("main got result\n");
fflush(stdout);
}
thread() {
while (!done) {
wait for data in task queue;
printf ("thread finished processing\n");
fflush(stdout);
put data in result queue;
}
}
이 같은 출력을 얻을 수 있나요 내 스레드 안전 데이터 큐가 제대로 작동하는 경우 다음?
main got result
thread finished processing
stdio는 이와 같이 재정렬 될 수 있습니까, 아니면 "스레드 안전"대기열이 아닌지 확실한 신호입니까?
위의 코드에서 C++로 컴파일하고 iostream을 main (하지만 여전히 printf를 사용하고 있습니다) 섹션에서 iostreams를 사용하면 답변이 변경됩니까?
이러한 순서 재 지정이 발생하지는 않지만 구현에 따라 다를 수 있습니다. 결과 큐에 데이터를 추가하기 전에 스레드에서 stdout을 인쇄하고 플러시합니다. 대기열에 동기화 문제가 있다고 가정하는 것이 좋습니다. –
필자의 경우 실제로 어떤 조건으로 인해 "대기열에있는 데이터 대기"가 중간에 차단 해제 될 수 있는지 오해 한 것입니다. 해당 함수에 대한 반환 값 확인을 수정하면 문제가 해결됩니다. 고마워요, 당신은 문제를 디버깅하기위한 올바른 길로 나를 안내합니다. – pavon