我理解在信号处理程序中访问静态变量是未定义的行为,除非变量声明为volatile sig_atomic_t
。但是,我正在为64位机器编写程序,其中sig_atomic_t恰好是32位。我可以使用long
等效的sig_atomic_t
吗?
我知道sig_atomic_t
只是int
的typedef,所以也许volatile long
会这样做;我只是不习惯做任何特别未定义的行为。
谢谢!
答案 0 :(得分:1)
答案似乎是" no",标准不涵盖long
类似物。 Linux: Why is sig_atomic_t typedef'ed to int?的答案涉及很多细节,引用的标准明确省略了任何可能大于整数的类型。
如Using long data inside signal handler.所述,信号处理程序当然可以访问任何类型的数据,但不能依赖于共享其他类型的数据。
答案 1 :(得分:0)
新的C11标准指定了一个可选的并发模型和几种类型,可以安全地用于信号处理程序。
关于信号处理程序,它现在说(强调我的):
如果信号处理程序引用静态或线程存储持续时间不是 无锁原子对象 的任何对象,而不是通过赋值,则行为未定义声明为 volatile sig_atomic_t
的对象
无锁类型是底层架构直接支持对原子操作进行操作的类型(不需要使用锁)。
因此,<stdatomic.h>
和#define
ATOMIC_LONG_LOCK_FREE
s atomic_long
,您可以使用<stdatomic.h>
中的volatile sig_atomic_t
来代替singularities
。这是例如在AMD64上使用GCC 4.9+的情况。