volatile sig_atomic_t
是在信号处理程序和主应用程序之间共享数据的保证安全方式。当在具有更宽松内存模型的现代CPU上运行时,Posix可以保证什么内存排序。具体来说,在使用volatile sig_atomic_t
读取或写入数据时,应该使用内存屏障/内存栅栏吗?
编辑:只是为了澄清。我的问题是,当使用sig_atomic_t时,如何才能保证就轻松的内存顺序而言不会发生坏事,尤其是在现代高度缓存,多核等架构中。
最佳答案
由于POSIX尚未与C++(C11)内存模型集成,因此目前不做任何内存排序保证。
C11确保volatile sig_atomic_t
类型的对象即使没有围墙也可以跨信号处理程序保留其值。如果访问其他对象,则其值不确定。 atomic_signal_fence
的名称错误,因为如标准中所指定,它不能用于访问其他类型的对象(volatile sig_atomic_t
除外),从而无法跨信号处理程序保留其值。
对于异步信号,可以通过在专用线程中处理它们并将其阻止用于所有其他线程来避免这些问题。对于大多数同步信号(例如,整数除以零触发的SIGFPE
,或用于访问未映射内存的SIGBUS
或SIGSEGV
),我认为没有任何标准指定发生了什么。这确实很奇怪,因为异步信号应该更难处理,但是目前情况恰恰相反。