c ++:为啥执行回调但回调定义之前的函数没有?
Posted
技术标签:
【中文标题】c ++:为啥执行回调但回调定义之前的函数没有?【英文标题】:c++: Why is callback executed but function before callback definition not?c ++:为什么执行回调但回调定义之前的函数没有? 【发布时间】:2013-11-07 13:29:49 【问题描述】:我想知道为什么在没有执行上层代码的情况下调用函数 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 正在执行?
谢谢
【问题讨论】:
也有错误。 std:cout 应该是 std::cout 【参考方案1】:您不刷新缓冲区。尝试在末尾添加<< 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.
【讨论】:
【参考方案2】:cout 被缓冲,如果缓冲区没有被刷新,它不会立即打印。
你可以使用:
std::cout << "Text" << std::endl;
或者:
std::cout << "Text\n" << std::flush;
刷新缓冲区。
【讨论】:
以上是关于c ++:为啥执行回调但回调定义之前的函数没有?的主要内容,如果未能解决你的问题,请参考以下文章