- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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
用于访问未映射的内存),我不认为任何标准都规定了会发生什么。这真的很奇怪,因为异步信号应该更难处理,但目前情况恰恰相反。
关于c++ - volatile sig_atomic_t 的内存安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52641332/
编译器或操作系统如何区分 sig_atomic_t 类型和普通的 int 类型变量,并确保操作是原子的?使用两者的程序具有相同的汇编代码。如何特别注意使操作原子化? 最佳答案 sig_atomic_t
假设我有一个标志来指示我用信号启用的退出条件。例如,然后我可以将以下处理程序附加到 SIGUSR1。 volatile sig_atomic_t finished = 0; void catch_si
因为我需要在 SIGCHLD 到达时更新作业状态,所以我如何知道 sig_atomic_t 的值是否已更改?代码看起来像这样... sig_atomic_t child_status; sig_ato
这是一个使用 volatile sig_atomic_t 的简单玩具程序. #include #include #include #include #define UNUSED(x) (voi
我想要一个哈希表,其中对每个元素的访问都应该是原子的,我不想使用锁。我可以使用指针来引用 sig_atomic_t 类型的变量吗? 最佳答案 没有。 sig_atomic_t用于信号处理程序,它不会做
volatile sig_atomic_t 是一种在信号处理程序和主应用程序之间共享数据的有保障的安全方式。当在具有更宽松内存模型的现代 CPU 上运行时,Posix 能保证什么内存顺序。具体来说,在
根据 this站点,可以使用 volatile sig_atomic_t 类型的变量在信号处理程序中。现在我的问题是,例如下面的代码仍然是原子的,因此不会引入竞争条件吗? 假设我们正在使用多核处理器(
我正在尝试创建一个全局变量,在我的 msh.c 文件中初始化为: volatile sig_atomic_t sig_int = 0; 仅此一项似乎就可以了。但是,如果我转到我的 proto.h 文件
如题。我可以使用 std::atomic<> 吗?在信号处理程序中或执行 sig_atomic_t提供其他编译器功能? 最佳答案 n3376 1.9/6 When the processing of
在我的平台(X86、Fedora、gcc 9.1.1)上,sig_atomic_t 类型定义为普通的 int。 在 C++ 标准中,sig_atomic_t 始终与 volatile 限定符一起使用。
例子 #include #include #include volatile std::sig_atomic_t gSignalStatus = 0; void signal_handler(i
在我的 Linux 机器上,sig_atomic_t 是一个普通的旧 int。 ints 是否具有特殊的原子质量? $ gcc -v Using built-in specs. Target: x86
根据标题。我可以使用 std::atomic<>在信号处理程序中或执行sig_atomic_t提供其他编译器功能? 最佳答案 n3376 1.9/6 When the processing of th
如果我在具有原子读取和递增/递减支持的硬件上,我可以使用 volatile sig_atomic_t 吗?在 C++03 中访问原子操作并避免完全成熟的互斥锁,或者我必须等待 C++11 和 std:
volatile sig_atomic_t 是否提供任何内存顺序保证?例如。如果我只需要加载/存储一个整数,可以使用吗? 例如这里: volatile sig_atomic_t x = 0; ...
我是一名优秀的程序员,十分优秀!