2013-10-11 4 views
1

Пусть у меня есть код, как например:STDOUT порядок с несколькими потоками

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++ и используя iostreams в разделе «сделать некоторые вещи» основного (но все еще использующего printf, где показано) в коде выше?

+0

Маловероятно, что такое переупорядочение происходит, но оно может быть зависимым от реализации. Вы печатаете и стираете stdout в потоке перед добавлением данных в очередь результатов. Вероятно, это вариант, предполагающий, что у вас есть проблемы с синхронизацией с очередями. –

+0

В моем случае это было действительно вызвано тем, что я не понял, какие условия могут вызвать «ожидание данных в очереди», чтобы разблокировать преждевременно. Модификация проверки возвращаемого значения для этой функции устранила проблему. Спасибо, ребята, вы поставили меня на правильный путь для отладки проблемы. – pavon

ответ

1

Nope.

Даже вы выполняете два потока асинхронно (я не знаю, являетесь ли вы здесь), внутри каждого потока команды выполняются по порядку.

Итак, ваш поток() сначала напечатает «обработанную обработкой протектора», а затем поместит данные в очередь результатов. Только тогда ваш основной() получит сообщение и напечатает «основной полученный результат».

+0

Хорошо. Это то, что я понял из лет программирования C, но я видел всевозможные странности, смешивающие iostream и stdio, и я до сих пор не полностью уверен в своем понимании буферизации/синхронизации, которое происходит между этими двумя. – pavon

+0

Я просто говорю по опыту. Я не могу придумать, каким образом эти два выхода будут заменены. Но кто знает, может произойти какое-то странное состояние. –

Смежные вопросы