C++ 可以在信号处理程序中设置承诺吗?

C++ 可以在信号处理程序中设置承诺吗?,c++,c++11,promise,signal-handling,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, [] (

我正在寻找一种方法来停止每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;
    }
}
#包括
#包括
#包括
#包括
承诺停止;
int main(){
std::signal(SIGINT,[](int){stop.set_value();});
自动未来=停止。获取未来();
while(future.wait_for(std::chrono::seconds(1))!=std::future_status::ready){

std::cout我相信您在这里看到的是由于在信号处理程序中调用标准库函数(不在信号安全函数列表中)而导致的未定义行为

信号处理函数(即用户定义的)的限制非常广泛,并且非常复杂

另一件需要注意的事情是,如果信号处理程序引用的任何对象的静态或线程本地(自C++11)存储持续时间不是
std::atomic
(自C++11)或
volatile std::sig_atomic


正如@BasileStarynkevitch指出的,如果您在Linux上,请确保只从信号处理程序调用函数。

我预计会发生崩溃?您是否检查了信号处理的疯狂限制:在Linux上,信号处理也非常重要relevant@BasileStarynkevitch:用您的评论更新了答案。我正期待它,但答案见准女士绝对不会:)