sig_atomic_t实际上如何工作?
编译器或操作系统如何区分sig_atomic_t类型和普通的int类型变量,并确保操作是primefaces的? 使用两者的程序具有相同的汇编代码。 如何特别注意使操作成为primefaces?
sig_atomic_t
不是primefaces数据类型。 它只是允许在信号处理程序的上下文中使用的数据类型,即全部。 因此,最好将名称读作“相对于信号处理的primefaces”。
为了保证与信号处理程序之间的通信,只需要primefaces数据类型的一个属性,即读取和更新将始终看到一致的值。 其他数据类型(例如可能long long
)可以用较低和较高部分的几个汇编指令编写,例如, sig_atomic_t
保证一次读取和写入。
因此,平台可以选择任何整数基类型作为sig_atomic_t
,它可以保证可以在信号处理程序中安全地使用volatile sig_atomic_t
。 许多平台为此选择了int
,因为他们知道对于他们来说int
是用一条指令编写的。
最新的C标准C11具有primefaces类型,但它们完全不同。 其中一些(那些“无锁”)也可能用于信号处理程序,但这又是一个完全不同的故事。
请注意, sig_atomic_t
不是线程安全的,只是异步信号安全。
primefaces学涉及两种类型的障碍:
- 编译器障碍。 它确保编译器不会相对于对其他变量的读取和写入对primefaces变量的读/写重新排序。 这就是
volatile
关键字的作用。 - CPU障碍和可见性。 它确保CPU不会重新排序读取和写入。 在x86上,对齐1,2,4,8字节存储的所有加载和存储都是primefaces的。 可见性可确保商店对其他线程可见。 同样,在Intel CPU上,由于高速缓存一致性和内存一致性协议MESI ,存储对其他线程立即可见。 但这可能会在未来发生变化。 有关详细信息,请参阅英特尔®64和IA-32架构软件开发人员手册第3A卷中的§8.1锁定primefaces操作。
对于主题手表primefaces武器的综合处理:C ++记忆模型和现代硬件 。
sig_atomic_t
通常只是一个typedef
(对某些特定于系统的整数类型,通常为int
或long
)。 使用volatile sig_atomic_t
非常重要(不仅仅是sig_atomic_t
)。
添加volatile
关键字时,编译器必须避免大量优化。
最近的C11标准添加了
和
。 你需要一个非常新的GCC (例如4.9 )来支持它。
使用两者的程序具有相同的汇编代码。 如何特别注意使操作成为primefaces?
虽然这是一个老问题,但我认为仍然值得专门解决这部分问题。 在Linux上, sig_atomic_t
由glibc提供。 glibc中的sig_atomic_t
是int
的typedef,没有特殊处理(截至本文)。 glibc文档解决了这个问题:
实际上,您可以假设int是primefaces的。 您还可以假设指针类型是primefaces的; 这很方便。 这两个假设都适用于GNU C Library支持的所有机器以及我们所知道的所有POSIX系统。
换句话说,普通的int
已经满足了glibc支持的所有平台上的sig_atomic_t
的要求,并且不需要特殊的支持。 尽管如此,C和POSIX标准要求sig_atomic_t
因为可能存在一些我们想要实现C和POSIX的exception机器,其中int
sig_atomic_t
的要求。
这种数据类型似乎是primefaces的。 从这里: https : //www.gnu.org/software/libc/manual/html_node/Atomic-Types.html
24.4.7.2primefaces类型为避免中断对变量的访问的不确定性,可以使用访问始终为primefaces的特定数据类型:sig_atomic_t。 读取和写入此数据类型保证在单个指令中发生,因此处理程序无法在访问的“中间”运行。
类型sig_atomic_t始终是整数数据类型,但它是哪一个,以及它包含多少位,可能因机器而异。
数据类型:sig_atomic_t这是一个整数数据类型。 始终以primefaces方式访问此类对象。
实际上,您可以假设int是primefaces的。 您还可以假设指针类型是primefaces的; 这很方便。 这两个假设都适用于GNU C Library支持的所有机器以及我们所知道的所有POSIX系统。