sig_atomic_实际上是如何工作的?
编译器或操作系统如何区分sig_atomic_t类型和普通int类型变量,并确保操作是原子的?使用两者的程序具有相同的汇编代码。如何特别注意使操作原子化?sig_atomic_实际上是如何工作的?,c,linux,signals,C,Linux,Signals,编译器或操作系统如何区分sig_atomic_t类型和普通int类型变量,并确保操作是原子的?使用两者的程序具有相同的汇编代码。如何特别注意使操作原子化?sig\u atomic\u t通常只是一个typedef(对于某些特定于系统的整数类型,通常是int或long)。使用volatile sig_atomic_t(不仅仅是sig_atomic_t)非常重要 添加volatile关键字时,编译器必须避免大量优化 最近的标准增加了\u原子和。您需要最新的(例如)支持它。请注意,sig\u atom
sig\u atomic\u t
通常只是一个typedef
(对于某些特定于系统的整数类型,通常是int
或long
)。使用volatile sig_atomic_t
(不仅仅是sig_atomic_t
)非常重要
添加volatile
关键字时,编译器必须避免大量优化
最近的标准增加了
\u原子
和
。您需要最新的(例如)支持它。请注意,sig\u atomic\u t
不是线程安全的,只是异步信号安全的
原子学涉及两种类型的障碍:
volatile
关键字所做的用于主题手表的综合处理。
sig_atomic\u t
不是原子数据类型。它只是允许您在信号处理程序的上下文中使用的数据类型,仅此而已。所以最好把这个名字读作“原子相对于信号处理”
为了保证与信号处理程序的通信和来自信号处理程序的通信,只需要原子数据类型的一个属性,即读取和更新始终会看到一致的值。其他数据类型(例如,long
)可以使用多条汇编指令编写,用于较低和较高的部分,例如,sig\u atomic\t
保证一次读取和写入
因此,平台可以选择任何整数基类型作为sig_-atomic_t
,它可以保证volatile sig_-atomic_t
可以安全地在信号处理程序中使用。许多平台为此选择了int
,因为他们知道int
是用一条指令编写的
最新的C标准C11有原子类型,但这是一个完全不同的东西。其中一些(无锁的)也可以用在信号处理程序中,但情况完全不同
使用两者的程序具有相同的汇编代码。如何额外注意使操作原子化
虽然这是一个老问题,但我认为这部分问题仍然值得具体解决。在Linux上,sig_atomic_t
由glibc提供int
的一个typedef,没有特殊处理(截至本文)。地址如下:
实际上,您可以假设int是原子的。你也可以假设
指针类型是原子的;那很方便。这两个
假设在GNUC库支持的所有机器上都是正确的
支持和支持我们所知的所有POSIX系统
换句话说,在glibc支持的所有平台上,常规的
int
已经满足了sig\u atomic\u t
的要求,不需要特殊的支持。尽管如此,C和POSIX标准规定了sig_atomic_t
,因为可能有一些我们想要在其上实现C和POSIX的异国机器,int
不满足sig_atomic_t
的要求。这种数据类型似乎是原子的。发件人: 24.4.7.2原子类型为避免关于中断变量访问的不确定性,您可以使用特定的数据类型,该数据类型的访问权限是有限的 总是原子的:sig_原子的。无法读取和写入此数据类型 保证在一条指令中发生,所以没有办法 在Access中运行“中间”的处理程序。 sig_atomic_t类型始终是整数数据类型,但它是哪一种类型 是,以及它包含多少位,可能因机器而异 数据类型:sig_atomic_t这是一种整数数据类型。本文件的目的 类型总是以原子方式访问 实际上,您可以假设int是原子的。你也可以假设 指针类型是原子的;那很方便。这两个 假设在GNUC库支持的所有机器上都是正确的 支持和支持我们所知的所有POSIX系统
不相关。即使
sig_atomic_t
的名称中有原子,它也不是原子数据类型。@JensGustedt你把原子性和可见性混淆了。这是怎么回事?我不认为我是那个把事情弄糊涂的人。我只是提醒您C标准中的一个事实,sig_atomic_t
不是原子数据类型。它只是为信号处理程序提供了某些保证。请看我的答案。@JensGustedt将sig_atomic_t
定义为所有TME的原子对象:“定义的类型是sig_atomic_t
,它是对象的(可能是易失性限定的)整数类型,即使在存在异步中断的情况下也可以作为原子实体访问。”@你误解了这个定义<代码>信号原子\u t始终是原子的。定义中的“即使存在异步中断”部分并没有将原子性限制为异步中断,它只是强调原子性的要求,包括异步中断。注意,我不是说