sig_atomic_t如何实际工作?

编译器或操作系统如何区分sig_atomic_ttypes和普通的inttypesvariables,并确保操作是primefaces的? 使用两者的程序具有相同的汇编代码。 如何进行额外的照顾才能使操作primefaces化?

Solutions Collecting From Web of "sig_atomic_t如何实际工作?"

sig_atomic_t不是原子数据类型。 这只是你被允许在信号处理器的上下文中使用的数据类型,就是这样。 所以最好把名字看作是“相对于信号处理的原子”。

为了保证与信号处理程序的通信,只需要原子数据类型的一个属性,即读取和更新将始终保持一致的值。 其他数据类型(比如long long )可以用几个汇编指令编写,例如sig_atomic_t保证一次读写。

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

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

请注意, sig_atomic_t不是线程安全的,只有异步信号安全。

原子学涉及两种类型的障碍:

  1. 编译器障碍。 它确保编译器不会重新排序读/写相对于读取和写入其他变量的原子变量。 这是volatile关键字所做的。
  2. CPU屏障和能见度。 它确保CPU不会重新排序读取和写入。 在x86上,所有加载和存储对齐的1,2,4,8字节的存储都是原子的。 可见性确保商店变得对其他线程可见。 同样,在Intel CPU上,由于缓存一致性和内存一致性协议MESI ,存储对其他线程立即可见。 但是,未来可能会改变。 有关更多详细信息,请参阅英特尔®64和IA-32架构软件开发人员手册卷3A中的§8.1锁定原子操作。

用于综合处理主题的武器:C ++内存模型和现代硬件 。

sig_atomic_t通常只是一个typedef (对于某些系统特定的整型,一般为intlong )。 使用volatile sig_atomic_t (不仅仅是sig_atomic_t )是非常重要的。

当你添加volatile关键字时,编译器必须避免很多优化。

最近的C11标准增加了<stdatomic.h><stdatomic.h> 。 你需要一个非常新的GCC (例如4.9 )来支持它。