编译器或操作系统如何区分sig_atomic_t类型和普通int类型变量,并确保操作是原子的?使用两者的程序具有相同的汇编代码。如何额外注意使操作原子化
sig_atomic_t不是原子数据类型。它只是允许您在信号处理程序的上下文中使用的数据类型,仅此而已。所以最好把这个名字读作“原子相对于信号处理”
为了保证与信号处理程序的通信和来自信号处理程序的通信,只需要原子数据类型的一个属性,即读取和更新始终会看到一致的值。其他数据类型(例如,long)可以使用多条汇编指令编写,用于较低和较高的部分,例如,sig\u atomic\t保证一次读取和写入
因此,平台可以选择任何整数基类型作为sig_-atomic_t,它可以保证volatile sig_-atomic_t可以安全地在信号处理程序中使用。许多平台为此选择了int,因为他们知道int是用一条指令编写的
最新的C标准C11有原子类型,但这是一个完全不同的东西。其中一些(无锁的)也可以用在信号处理程序中,但情况完全不同