Пусть у меня есть код, как например: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, где показано) в коде выше?
Маловероятно, что такое переупорядочение происходит, но оно может быть зависимым от реализации. Вы печатаете и стираете stdout в потоке перед добавлением данных в очередь результатов. Вероятно, это вариант, предполагающий, что у вас есть проблемы с синхронизацией с очередями. –
В моем случае это было действительно вызвано тем, что я не понял, какие условия могут вызвать «ожидание данных в очереди», чтобы разблокировать преждевременно. Модификация проверки возвращаемого значения для этой функции устранила проблему. Спасибо, ребята, вы поставили меня на правильный путь для отладки проблемы. – pavon