2012-03-13 91 views
3

此設置C++ 11線程分離

void run() 
{ 
    while (true) 
    { 
     std::cout << "Hello, Thread!\n"; 
     std::this_thread::sleep_for(std::chrono::seconds(1)); 
    } 
} 

void foo() 
{ 
    std::thread t(run); 
    t.detach(); 
    //std::this_thread::sleep_for(std::chrono::seconds(3)); 
} 

int main() 
{ 
    foo(); 
    getchar(); 
} 

沒有給我輸出直到我按回車鍵(返回的getchar和程序結束,但我可以看到一小會兒的輸出)。但是,使用foo中的out註釋行時,會直接顯示輸出。 (甚至在foo返回之後)我正在使用VS11 beta版本。 根據標準,此處需要哪些行爲?

+0

緩存爲每個線程可能的輸出? – dreamlax 2012-03-13 21:19:20

+1

嗯..我試過std :: endl,得到一個斷言,切換行,以便新的線程第一次等待一秒鐘,然後使輸出,嘿,它的作品。滑稽。所以輸出流不能被快速的初始化或者那裏發生了什麼? – cooky451 2012-03-13 21:22:23

+1

我認爲寫入標準輸出和從標準輸入讀取是序列化操作。 – 2012-03-13 21:22:36

回答

-5

我認爲這是因爲你使用std :: cout,whick被緩衝。嘗試使用std :: cerr。

+0

這不是原因。例如,這個代碼可以在Linux下與GCC協同工作。 std :: cout緩衝區刷新換行符。 – 2012-03-13 23:08:38

+1

@RafałRawicki:我不認爲你對換行符的陳述是真實的。如果您使用std :: endl,則std :: cout會刷新,如果您只是使用\ n字符,則不會。比較http://stackoverflow.com/questions/213907/c-stdendl-vs-n – AbuBakr 2012-03-27 16:58:39

+0

在這種情況下,這種說法是真實的,但沖洗在新行不是一個通用的規則,請參閱http://stackoverflow.com/questions/5229096/does-printf-always-flush-the-buffer-on-encounter-a-newline – 2012-03-27 17:14:55

3

你可以嘗試使用std::flush手動刷新COUT緩衝

+0

你可以嘗試閱讀已經給出的所有答案和評論。 :p – cooky451 2013-01-26 17:55:07

+2

你可以嘗試確認一個答案,這樣大家都知道你的問題已經回答了:p – jrl 2013-01-27 07:41:20

4

"\n"並不刷新輸出緩衝區。您需要使用std::endl而不是刷新緩衝區。

void run() 
{ 
    while (true) 
    { 
     std::cout << "Hello, Thread!"<<std::endl; 
     std::this_thread::sleep_for(std::chrono::seconds(1)); 
    } 
} 
+1

...或者使用''n''和'std :: flush',或者可以。 – 2013-07-30 08:36:52