编译器或操作系统如何区分sig_atomic_t类型和普通的int类型变量,并确保操作是原子的?使用两者的程序具有相同的汇编代码.如何特别注意使操作成为原子?
Jen*_*edt 23
sig_atomic_t不是原子数据类型.它只是您可以在信号处理程序的上下文中使用的数据类型,即全部.因此,最好将名称读作"相对于信号处理的原子".
为了保证与信号处理程序之间的通信,只需要原子数据类型的一个属性,即读取和更新将始终看到一致的值.其他数据类型(例如可能long long)可以用较低和较高部分的几个汇编指令编写,例如sig_atomic_t保证一次读取和写入.
因此,平台可以选择任何整数基类型sig_atomic_t,因为它可以保证volatile sig_atomic_t可以安全地用于信号处理程序.许多平台选择int了这个,因为他们知道对他们int来说是用一条指令写的.
最新的C标准C11具有原子类型,但这是完全不同的东西.其中一些(那些"无锁")也可能用于信号处理程序,但这又是一个完全不同的故事.
Max*_*kin 11
请注意,这sig_atomic_t不是线程安全的,只有异步信号安全.
原子学涉及两种类型的障碍:
volatile关键字的作用.对于主题手表原子武器的综合处理:C++记忆模型和现代硬件.
| 归档时间: |
|
| 查看次数: |
13004 次 |
| 最近记录: |