我想知道为什么在没有执行高级代码的情况下调用函数doWork()。代码如下:
void doWork()
{
std::cout<<"Hello World>";
sleep(1);
doWork();
}
....
void foo()
{
std:cout<<"This is text is never seen in the console but doWork timer callback works";
std::thread thread([&]{doWork();});
}
为什么std:cout不工作但std :: thread正在执行?
由于
答案 0 :(得分:2)
您不刷新缓冲区。请尝试在最后添加<< std::flush
或<< std::endl
。
在对象thread
被破坏之前,您需要等待线程中的执行完成。
thread.join(); // Wait for thread to finish.
您不需要将所有内容捕获为lambda([&]
)中的引用。您似乎没有使用任何捕获。
如果您使用的是可移植的C ++ 11 std::thread
库,请不要使用特定于Linux的sleep
函数。而是使用std::this_thread::sleep_for
,例如:
void doWork() { // (1. Flush buffer here too)
std::cout << "Hello World>" << std::flush;
// 4. Use portable sleep.
std::this_thread::sleep_for(std::chrono::seconds(1));
doWork();
}
// ....
void foo() {
// 1. Flush buffer.
std::cout << "This text is seen in the console" << std::endl;
std::thread thread([] { // 3. No need to capture everything by reference
doWork();
});
thread.join(); // 2. Wait for thread to finish.
}
答案 1 :(得分:0)
cout是缓冲的,如果缓冲区未刷新,则不会立即打印。
您可以使用:
std::cout << "Text" << std::endl;
或者:
std::cout << "Text\n" << std::flush;
冲洗缓冲区。