volatile sig_atomic_t是在信号处理程序和主应用程序之间共享数据的一种保证安全的方式。当在具有更宽松的内存模型的现代CPU上运行时,Posix提供了什么内存排序保证。具体地说,在使用volatile sig_atomic_t读取或写入数据时,是否应该使用内存屏障/内存栅栏
编辑:只是为了澄清一下。我的问题是,当使用sig_atomic_t时,我们如何保证不会在宽松的内存排序方面发生不好的事情,特别是在现代的高度缓存、多核等架构中。
发布于 2018-10-04 16:43:03
POSIX目前没有任何内存排序保证,因为它还没有集成到C++ (C11)内存模型中。
C11确保volatile sig_atomic_t类型的对象在信号处理程序之间保留它们的值,即使没有屏障也是如此。其他对象如果被访问,则具有不确定的值。atomic_signal_fence命名错误,因为正如标准中指定的那样,它不能用于访问其他类型(除了volatile sig_atomic_t之外)的对象,从而使它们在信号处理程序中保留它们的值。
对于异步信号,可以通过在专用线程中处理它们并为所有其他线程阻塞它们来避免这些问题。对于大多数同步信号(例如由整数除以零触发的SIGFPE,或者用于访问未映射内存的SIGBUS或SIGSEGV ),我认为没有任何标准指定会发生什么。这真的很奇怪,因为异步信号应该更难处理,但目前情况正好相反。
https://stackoverflow.com/questions/52641332
复制相似问题