2012-03-13 68 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