编译器或操作系统如何区分 sig_atomic_t 类型和普通的 int 类型变量,并确保操作是原子的?使用两者的程序具有相同的汇编代码。如何特别注意使操作原子化?
最佳答案
sig_atomic_t
不是原子数据类型。它只是允许您在信号处理程序的上下文中使用的数据类型,仅此而已。因此,最好将该名称理解为“与信号处理相关的原子”。
为了保证与信号处理程序的通信,只需要原子数据类型的一个属性,即读取和更新将始终看到一致的值这一事实。其他数据类型(例如可能是 long long
)可以用低位和高位部分的多条汇编指令来编写,例如sig_atomic_t
保证一次性读取和写入。
因此,平台可以选择任何整数基类型作为 sig_atomic_t
,为此它可以保证 volatile sig_atomic_t
可以安全地用于信号处理程序。许多平台为此选择了 int
,因为他们知道 int
是用一条指令编写的。
最新的 C 标准 C11 具有原子类型,但它们是完全不同的东西。其中一些(那些“无锁”的)也可以用在信号处理程序中,但这又是一个完全不同的故事。
关于c - sig_atomic_t 实际上是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24931456/