Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sig_atomic_实际上是如何工作的?_C_Linux_Signals - Fatal编程技术网

sig_atomic_实际上是如何工作的?

sig_atomic_实际上是如何工作的?,c,linux,signals,C,Linux,Signals,编译器或操作系统如何区分sig_atomic_t类型和普通int类型变量,并确保操作是原子的?使用两者的程序具有相同的汇编代码。如何特别注意使操作原子化?sig\u atomic\u t通常只是一个typedef(对于某些特定于系统的整数类型,通常是int或long)。使用volatile sig_atomic_t(不仅仅是sig_atomic_t)非常重要 添加volatile关键字时,编译器必须避免大量优化 最近的标准增加了\u原子和。您需要最新的(例如)支持它。请注意,sig\u atom

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

sig\u atomic\u t
通常只是一个
typedef
(对于某些特定于系统的整数类型,通常是
int
long
)。使用
volatile sig_atomic_t
(不仅仅是
sig_atomic_t
)非常重要

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


最近的标准增加了
\u原子
。您需要最新的(例如)支持它。

请注意,
sig\u atomic\u t
不是线程安全的,只是异步信号安全的

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

  • 编译器障碍。它确保编译器不会相对于对其他变量的读写,对原子变量的读写进行重新排序。这就是
    volatile
    关键字所做的
  • CPU屏障和可见性。它确保CPU不会对读取和写入进行重新排序。在x86上,对齐的1,2,4,8字节存储的所有加载和存储都是原子的。可见性确保存储对其他线程可见。同样,在英特尔CPU上,由于内存不足,其他线程可以立即看到存储。但这在未来可能会改变。有关详细信息,请参阅英特尔64和IA-32体系结构软件开发人员手册第3A卷中的§8.1锁定原子操作

  • 用于主题手表的综合处理。

    sig_atomic\u t
    不是原子数据类型。它只是允许您在信号处理程序的上下文中使用的数据类型,仅此而已。所以最好把这个名字读作“原子相对于信号处理”

    为了保证与信号处理程序的通信和来自信号处理程序的通信,只需要原子数据类型的一个属性,即读取和更新始终会看到一致的值。其他数据类型(例如,
    long
    )可以使用多条汇编指令编写,用于较低和较高的部分,例如,
    sig\u atomic\t
    保证一次读取和写入

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

    最新的C标准C11有原子类型,但这是一个完全不同的东西。其中一些(无锁的)也可以用在信号处理程序中,但情况完全不同

    使用两者的程序具有相同的汇编代码。如何额外注意使操作原子化

    虽然这是一个老问题,但我认为这部分问题仍然值得具体解决。在Linux上,
    sig_atomic_t
    由glibc提供sig_atomic_t是
    int
    的一个typedef,没有特殊处理(截至本文)。地址如下:

    实际上,您可以假设int是原子的。你也可以假设 指针类型是原子的;那很方便。这两个 假设在GNUC库支持的所有机器上都是正确的 支持和支持我们所知的所有POSIX系统


    换句话说,在glibc支持的所有平台上,常规的
    int
    已经满足了
    sig\u atomic\u t
    的要求,不需要特殊的支持。尽管如此,C和POSIX标准规定了
    sig_atomic_t
    ,因为可能有一些我们想要在其上实现C和POSIX的异国机器,
    int
    不满足
    sig_atomic_t
    的要求。这种数据类型似乎是原子的。
    发件人:

    24.4.7.2原子类型为避免关于中断变量访问的不确定性,您可以使用特定的数据类型,该数据类型的访问权限是有限的 总是原子的:sig_原子的。无法读取和写入此数据类型 保证在一条指令中发生,所以没有办法 在Access中运行“中间”的处理程序。

    sig_atomic_t类型始终是整数数据类型,但它是哪一种类型 是,以及它包含多少位,可能因机器而异

    数据类型:sig_atomic_t这是一种整数数据类型。本文件的目的 类型总是以原子方式访问

    实际上,您可以假设int是原子的。你也可以假设 指针类型是原子的;那很方便。这两个 假设在GNUC库支持的所有机器上都是正确的 支持和支持我们所知的所有POSIX系统


    不相关。即使
    sig_atomic_t
    的名称中有原子,它也不是原子数据类型。@JensGustedt你把原子性和可见性混淆了。这是怎么回事?我不认为我是那个把事情弄糊涂的人。我只是提醒您C标准中的一个事实,
    sig_atomic_t
    不是原子数据类型。它只是为信号处理程序提供了某些保证。请看我的答案。@JensGustedt将
    sig_atomic_t
    定义为所有TME的原子对象:“定义的类型是
    sig_atomic_t
    ,它是对象的(可能是易失性限定的)整数类型,即使在存在异步中断的情况下也可以作为原子实体访问。”@你误解了这个定义<代码>信号原子\u t始终是原子的。定义中的“即使存在异步中断”部分并没有将原子性限制为异步中断,它只是强调原子性的要求,包括异步中断。注意,我不是说