c ++信号处理程序可以唤醒一个线程吗?

时间:2014-08-21 17:59:23

标签: c++ multithreading signals

由于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(),因此我唯一的选择是忙于等待主线程(有或没有预定义)睡眠期。)

理想情况下,我希望主线程一直处于睡眠状态,直到发出信号,可能带有条件变量,但这看起来是非法的。

1 个答案:

答案 0 :(得分:1)

我建议(阻止信号和)使用sigwait(2)同步等待主线程中的信号,然后你完全避免了必须从信号处理程序到线程的通信问题。