易失性sig_atomic_t的内存安全性



volatile sig_atomic_t是在信号处理程序和主应用程序之间共享数据的保证安全方式。Posix 在具有更宽松内存模型的现代 CPU 上运行时提供什么内存排序保证。具体来说,在使用volatile sig_atomic_t读取或写入数据时是否应该使用内存屏障/内存围栏?

编辑:只是为了澄清。我的问题是,在使用sig_atomic_t时,我们如何保证在放松内存排序方面不会发生不好的事情,尤其是在现代高度缓存、多核等架构中。

POSIX目前不做任何内存排序保证,因为它尚未与C++(C11(内存模型集成。

C11 确保volatile sig_atomic_t类型的对象即使没有围栏,也能跨信号处理程序保留其值。 其他对象在访问时具有不确定的值。atomic_signal_fence被错误命名,因为正如标准中指定的那样,它不能用于访问其他类型的对象(除了volatile sig_atomic_t(,以便它们在信号处理程序中保留其值。

对于异步信号,可以通过在专用线程中处理它们并为所有其他线程阻止它们来避免这些问题。 对于大多数同步信号(例如由整数除以零触发的SIGFPE,或用于访问未映射内存的SIGBUSSIGSEGV(,我认为没有任何标准指定会发生什么。 这真的很奇怪,因为异步信号应该更难处理,但目前,情况正好相反。

最新更新