假設我有這樣的代碼,例如:標準輸出順序多線程
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++編譯並在上面的代碼中的main(「仍然使用printf」)中的「do some stuff」部分使用iostreams,答案會改變嗎?
這種重新排序不太可能發生,但它可能取決於實現。在將數據添加到結果隊列之前,您正在打印並刷新線程中的stdout。這是一種模式,假設你在隊列中有一些同步問題。 –
就我而言,這確實是由於我誤解了什麼情況會導致「等待隊列中的數據」提前解鎖而引起的。修改該函數的返回值檢查修復了該問題。謝謝你們,你們把我放在正確的軌道上來調試問題。 – pavon