volatile sig_atomic_t的正确使用方法

16
根据这个网站,我们可以在信号处理程序中使用volatile sig_atomic_t类型的变量。现在我的问题是,类似以下代码的实现是否仍然是原子的,从而不会引入竞争条件?
假设我们正在使用多核处理器(编辑:运行多线程程序)。在多核系统中,volatile sig_atomic_t是否有效,或者应该在多核系统(编辑:运行多线程程序)中的信号处理程序中使用C++11的atomic<unsigned int>
volatile sig_atomic_t a;

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

你的问题已经得到回答(“在多核系统中,volatile sig_atomic_t是否有效” - 不是),所以你应该接受提供的答案。 - Bulwersator
1个回答

21

除非你的程序是多线程的,否则信号处理程序永远不会与程序中的其他代码同时运行,当然它们也永远不会与它们中断的代码同时运行。只要在信号处理程序执行期间屏蔽了信号sig,你的代码就没问题。


22
那么 sig_atomic_t 和多线程没有任何关系,它只与确保被信号处理程序中断的操作的原子性有关,在同一线程中。也就是说,它确保您不会出现这样的序列:(1)主程序流写入高字节,(2)信号处理程序写入整个变量的新值并返回,(3)主程序流写入低字节(由于部分写入被信号中断)。 - R.. GitHub STOP HELPING ICE
2
作为支持@R..的参考,请查看《Linux编程接口》第21.1.3节。 - Nimjox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接