c – 计时器挂起主线程

我正在尝试用标准环境实现计时器
这是我的代码:

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;
}

结果我在5秒后在输出中看到:

// 5 seconds left
On Timer
main function

但是想看看:

main function
// 5 seconds left
On Timer

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

最佳答案
你的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();

转载注明原文:c – 计时器挂起主线程 - 代码日志