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