由于C ++信号处理程序应该只访问volatile std :: sig_atomic_t或std :: atomic(因为C ++ 11),是否有可能让线程休眠并用它唤醒?
std::atomic_bool exit_now(false);
void signal_handler(int signal)
{
exit_now=true;
}
int main() {
std::signal(SIGINT, signal_handler);
A a;
B b;
a.RunAsync();
b.RunAsync();
while(!exit_now)
std::this_thread::sleep_for(std::chrono::seconds(1));
a.Stop();
b.Stop();
return 0;
}
在这种情况下,A和B :: RunAsync()都在其他线程上开展业务,直到我调用:: Stop(),因此我唯一的选择是忙于等待主线程(有或没有预定义)睡眠期。)
理想情况下,我希望主线程一直处于睡眠状态,直到发出信号,可能带有条件变量,但这看起来是非法的。
答案 0 :(得分:1)
我建议(阻止信号和)使用sigwait(2)同步等待主线程中的信号,然后你完全避免了必须从信号处理程序到线程的通信问题。