一尘不染

sig_atomic_t实际上如何工作?

linux

编译器或OS如何区分sig_atomic_t类型和普通的int类型变量,并确保操作是原子的?两者都使用的程序具有相同的汇编代码。如何特别注意使操作原子化?


阅读 687

收藏
2020-06-02

共1个答案

一尘不染

sig_atomic_t不是原子数据类型。仅仅是允许您在信号处理程序的上下文中使用的数据类型,仅此而已。因此最好将其名称理解为“相对于信号处理而言是原子的”。

为了保证与信号处理程序之间的通信,仅需要原子数据类型的属性之一,即读取和更新将始终看到一致的值。其他数据类型(例如,也许long long)可以用几个汇编程序指令来写上下部分,例如sig_atomic_t,保证一次性读取和写入。

因此,平台可以选择任何整数基类型,sig_atomic_t以保证volatile sig_atomic_t可以在信号处理程序中安全使用。许多平台之所以选择int这样做,是因为他们知道,它们int是用一条指令编写的。

最新的C标准C11具有原子类型,但这是完全不同的东西。它们中的某些(那些是“无锁的”)也可以在信号处理程序中使用,但这又是一个完全不同的故事。

2020-06-02