使用信号侦听器线程 - 我该如何停止它?

Using a signal listener thread - how do I stop it?

我的主要方法的一个片段:

  std::atomic_bool runflag;
  // ...
  std::thread signaller([&]() mutable {
    while (runflag) {
      int sig;
      int rcode = sigwait(&set, &sig);
      if (rcode == 0) {
        switch (sig) {
          case SIGINT: {
            // handle ^C
          }
        }
      }
    }
  });
  
  while (runflag) {
    next = cin.get();
    // handle character input
  }
  signaller.join();

我正在使用基于 sigwait() 的方法来检测从命令行发送的 SIGINT

signaller 线程使用 sigwait() 来侦听信号。当 runflag 设置为 false 时程序终止。但是,发生这种情况时,signaller 线程仍会在 sigwait 处被阻塞。我不认为我可以使用条件变量,因为 sigwait 没有办法连接到其中。是否有替代解决方案最好不是 Linux-only?

编辑 1:或者,是否有 sigwait 的可中断版本?

您可以使用 sigtimedwait() 函数,该函数在作为参数给出的超时后 return 秒。

您将需要检查 sigtimedwait() 中的 return 值以检查它是否由于超时或信号到达而完成,然后根据此值您将需要处理信号或仅检查runflag 和 运行 再次 sigtimedwait()

这里有来自另一个答案的更多信息:

您可以通过让进程向自身发送另一个信号来唤醒信号处理线程,例如

kill(getpid(), SIGUSR1);