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学涉及两种类型的障碍:

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

对于主题手表primefaces武器的综合处理:C ++记忆模型和现代硬件 。

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

添加volatile关键字时,编译器必须避免大量优化。

最近的C11标准添加了 。 你需要一个非常新的GCC (例如4.9 )来支持它。

使用两者的程序具有相同的汇编代码。 如何特别注意使操作成为primefaces?

虽然这是一个老问题,但我认为仍然值得专门解决这部分问题。 在Linux上, sig_atomic_t由glibc提供。 glibc中的sig_atomic_tint的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系统。