2013-10-11 4 views
1

가정하자 나는이 같은 같은 코드 :표준 출력 순서

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를 사용하면 답변이 변경됩니까?

+0

이러한 순서 재 지정이 발생하지는 않지만 구현에 따라 다를 수 있습니다. 결과 큐에 데이터를 추가하기 전에 스레드에서 stdout을 인쇄하고 플러시합니다. 대기열에 동기화 문제가 있다고 가정하는 것이 좋습니다. –

+0

필자의 경우 실제로 어떤 조건으로 인해 "대기열에있는 데이터 대기"가 중간에 차단 해제 될 수 있는지 오해 한 것입니다. 해당 함수에 대한 반환 값 확인을 수정하면 문제가 해결됩니다. 고마워요, 당신은 문제를 디버깅하기위한 올바른 길로 나를 안내합니다. – pavon

답변

1

아니요.

두 개의 스레드를 비동기 적으로 실행 중이라도 (나는 여기 있는지 몰라) 각 스레드 내부에서 명령이 순서대로 실행됩니다.

그래서 thread()는 먼저 "밟아 처리 완료"를 인쇄 한 다음 데이터를 결과 대기열에 넣습니다. 그래야만 main()이 메시지를 받고 "main got result"를 출력 할 것입니다.

+0

알겠습니다. 이것이 내가 C 프로그래밍으로 수년 동안 해왔 던 것으로 이해하지만, iostream과 stdio를 혼합하는 모든 종류의 이상한 것들을 보았으며, 그 둘 사이에 일어나는 버퍼링/동기화에 대한 나의 이해에는 여전히 확신이 없습니다. – pavon

+0

나는 경험에서 말하고있다. 나는 두 가지 산출물을 바꿀 수있는 방법을 생각할 수 없다. 그러나 누가 알면 어떤 이상한 상태가 발생할 수 있습니다. –