我開始學習C++ 11標準中的線程,並且我正在嘗試一個非常基本的程序,它創建了10個線程,將它們加入然後退出。在線程功能,我想打印出的該指數環,我在創建線程,就像這樣:爲什麼std :: cout搶佔線程但printf不是?
std::vector<std::thread> threads;
for(int i = 0; i < 10; i++)
{
threads.push_back(std::thread([i](){ printf("Thread #%d\n", i); }));
}
這從產生併發程序預期的輸出,線程執行了順序:
Thread #0
Thread #2
Thread #1
Thread #3
Thread #4
Thread #5
Thread #6
Thread #7
Thread #8
Thread #9
但是當我嘗試使用std::cout
和std::endl
做同樣的事情,我得到這個:
Thread #0
Thread #Thread #2
Thread #3
Thread #9
1
Thread #8
Thread #4
Thread #5
Thread #7
Thread #6
這是爲什麼^ h與std::cout
,但不與printf
?
爲什麼你會想到第一輸出? – Yakk 2014-11-02 19:47:37
如果你的應用程序在Windows上運行,那麼'printf'似乎有一個互斥體限制對STDOUT的訪問。我從來沒有找到一些文件證實這一點,但這正是我多年來觀察到的...... – 2014-11-02 19:50:10
@Yakk嗯,如果他們按順序,我會更喜歡它,但我的理解是,線程通常不會那樣工作,我錯了嗎? – 2014-11-02 19:50:35