计时器挂起主线程

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)

似乎我的实现也挂起了主线程.怎么避免这个?

Ian*_*ix1 3

您的 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)