Ser*_*gio 5 c++ unix linux macos std
我正在尝试使用标准环境实现计时器这是我的代码:
bool shutdownDetected = false;
void signal_handler(const int sigid)
{
shutdownDetected = true;
}
int main(int argc, const char * argv[])
{
signal(SIGTERM, (sig_t)signal_handler);
std::async(std::launch::async, [&] () {
std::this_thread::sleep_for( std::chrono::milliseconds{5000});
std::cout << "On TIMER!" << std::endl;
} );
std::cout << "main function" << std::endl;
while (!shutdownDetected) {
}
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
结果我在5秒后在输出中看到:
// 5 seconds left
On Timer
main function
Run Code Online (Sandbox Code Playgroud)
但是想看看:
main function
// 5 seconds left
On Timer
Run Code Online (Sandbox Code Playgroud)
似乎我的实现也挂起了主线程.怎么避免这个?
您的 std::async 命令返回一个 std::future,然后立即销毁。问题是,未来的破坏涉及“加入”您创建的线程,这意味着析构函数将等待,直到线程自行结束,并且主线程中的代码执行在该过程完成之前不会继续。
简单的答案是将 std::async 调用的结果分配给一个变量,并可能在测试终止的循环中调用其 get() 成员函数。
auto t = std::async(std::launch::async, [&] () {
std::this_thread::sleep_for( std::chrono::milliseconds{5000});
std::cout << "On TIMER!" << std::endl;
} );
std::cout << "main function" << std::endl;
t.get();
Run Code Online (Sandbox Code Playgroud)