【问题标题】:c++ signal handler can wake a thread?c ++信号处理程序可以唤醒线程吗?
【发布时间】:2014-08-21 17:59:23
【问题描述】:

由于 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() 之前都在其他线程上执行它们的业务,所以我唯一的选择是在主线程上忙等待(有或没有预定义的睡眠期)。

理想情况下,我希望主线程在收到信号之前一直休眠,可能带有条件变量,但这看起来是非法的。

【问题讨论】:

    标签: c++ multithreading signals


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 2015-07-05
      • 1970-01-01
      • 2011-08-05
      相关资源
      最近更新 更多