是否可以在信号处理程序中设置承诺?

时间:2018-10-26 19:38:12

标签: c++ c++11 promise signal-handling

我一直在寻找一种方法来停止每2秒执行一次任务的线程。我决定尝试使用std :: promise / future,以便在设置promise时线程可以立即退出。

#include <future>
#include <iostream>
#include <chrono>
#include <csignal>

std::promise<void> stop;

int main() {

    std::signal(SIGINT, [] (int)  { stop.set_value(); } );

    auto future = stop.get_future();

    while (future.wait_for(std::chrono::seconds(1)) != std::future_status::ready) {
            std::cout << "I'm still there" << std::endl;
    }
}

实际上这是行不通的,并且会崩溃:

  

$ ./a.out我还在   ^抛出'std :: system_error'实例后调用终止   what():未知错误-1放弃   (核心已丢弃)

好吧,一个人应该照顾他在处理程序上下文中所做的事情,但是我必须说我没想到会发生崩溃。我不太了解... 你有什么主意吗?

1 个答案:

答案 0 :(得分:2)

我相信,由于在信号处理程序中调用了标准库函数(不在信号安全函数列表中),您在这里所拥有的是未定义的行为。

信号处理程序功能(由用户定义)的限制范围很广,documented here

要注意的另一件事是,信号处理程序是否引用了具有静态或线程本地(自C ++ 11起)存储持续时间而不是std::atomic(自C ++ 11起)或{ {1}}。

正如@BasileStarynkevitch指出的那样,如果您使用的是Linux,请确保仅从信号处理程序中调用async-signal-safe函数。