正确使用volatile sig_atomic_t

Met*_*est 14 c linux x86 signals c++11

根据这个站点,可以volatile sig_atomic_t在信号处理程序中使用类型的变量.现在我的问题是,例如下面的代码仍然是原子的,因此没有引入竞争条件?

假设我们使用的是多核处理器(编辑:运行多线程程序).并volatile sig_atomic_t针对多核系统摆在首位,甚至工作,或者我们应该使用atomic<unsigned int>的C++ 11的信号处理多核系统上(编辑:在运行多线程程序)?

volatile sig_atomic_t a;

static void signal_handler(int sig, siginfo_t *si, void *unused)
{
  int b;
  ................
  b = ...;
  a = a | b;
  ................
}
Run Code Online (Sandbox Code Playgroud)

R..*_*R.. 17

除非您的程序是多线程的,否则信号处理程序永远不会与程序中的其他代码同时运行,并且它们肯定不会与它们中断的代码同时运行.只要信号sig在信号处理程序的持续时间内被屏蔽,您的代码就可以了.

  • 那么`sig_atomic_t`与多线程方面无关.它只与确保同一线程*中信号处理程序*中断的操作的原子性有关,即确保不会得到如下序列:(1)主程序流写入高字节,(2)信号处理程序写入整个变量和返回的新值,(3)主程序流写入低字节(由于部分写入之间的信号中断). (20认同)
  • 作为支持@R 的参考。请参阅 Linux 编程接口的第 21.1.3 节 (2认同)