【发布时间】:2019-03-09 12:40:01
【问题描述】:
volatile sig_atomic_t 是在信号处理程序和主应用程序之间共享数据的有保证的安全方式。当在具有更宽松内存模型的现代 CPU 上运行时,Posix 会做出什么内存排序保证。具体来说,在使用volatile sig_atomic_t 读取或写入数据时是否应该使用内存屏障/内存栅栏?
编辑:只是为了澄清。我的问题是,在使用 sig_atomic_t 时,我们如何保证在宽松的内存排序方面不会发生坏事,尤其是在现代高度缓存、多核等架构中。
【问题讨论】:
-
如果需要显式指定内存排序,请使用 C11 或 C++11 原子类型。
-
我相信
sig_atomic_t早于 C++11,而现在你改用 C++11 原子。 -
另外,如果我必须使用原子,那么 volatile sig_atomic_t 永远不会安全。
-
无论如何,C 和 C++ 都有一个
atomic_signal_fence()函数,用于协调线程和在该线程上调用的信号处理程序之间的非原子类型(和需要锁定的原子类型)顺序。但是,如果您坚持使用不应该需要的volatile sig_atomic_t变量。 -
关于 volatile sig_atomic_t 见 Linux 编程接口第 21.1.3 节