C11是否禁止这种行为(显然是空气稀薄的存储)?

C11是否禁止这种行为(显然是空气稀薄的存储)?,c,linux,multithreading,gcc,c11,C,Linux,Multithreading,Gcc,C11,C11是否禁止上述行为?假设spinlock\u t是一种引用结构的类型,该结构只能通过其成员上的C11原子原语访问(实际上它使用Linux(内核)内存屏障,但假设不是这样,因此它不会因为使用特定于实现的接口而未定义)。除了标题中的问题外,它是否是“空气稀薄储存”的一个例子 提前感谢。不,因为这里介绍了C11中不禁止使用。C11只为\u原子的类型提供原子性保证,即您在语言中声明为原子的类型。由于内核使用它自己的原语来确保原子性,所以C11在这里帮不了你 与国产汇编程序相比,C11\u-Atomi

C11是否禁止上述行为?假设
spinlock\u t
是一种引用结构的类型,该结构只能通过其成员上的C11原子原语访问(实际上它使用Linux(内核)内存屏障,但假设不是这样,因此它不会因为使用特定于实现的接口而未定义)。除了标题中的问题外,它是否是“空气稀薄储存”的一个例子


提前感谢。

不,因为这里介绍了C11中不禁止使用。C11只为
\u原子的
类型提供原子性保证,即您在语言中声明为原子的类型。由于内核使用它自己的原语来确保原子性,所以C11在这里帮不了你


与国产汇编程序相比,C11
\u-Atomic
的变化在于
\u-Atomic
可能会改变数据类型的大小和对齐属性。例如,在给定的示例中,它可以强制尾随位字段位于下一个单词边界的边缘。

链接中的
struct example
大小写显然是一个编译器错误。一般来说,如果“被另一个处理器修改”是一种可能性,那么变量(即此处的自旋锁)就是应声明为不稳定的。(也许内核有一些额外的诡计)。@MattMcNabb:我认为你把volatile和atomic混淆了。volatile变量没有原子性或同步保证,请参阅搜索“C volatile atomic”时出现的问题。您是否引用了C11标准来说明这是一个编译器错误?。感谢您的回答。我对Linux内核不太熟悉,但似乎建议spinlock使用非易失性变量,但正确编写的代码应该只通过“内存屏障”(即
asm volatile
或等效物)访问锁。然而,C标准规定非易失性变量遵循一个内存模型,其行为就像只有一个线程一样;因此,编译器可以随时将相同的数据读写回该变量(甚至完全优化)。受自旋锁保护的共享数据不需要是易失性的,因为
asm
引入了实现定义的行为和gcc(希望如此!)因此,可以定义围栏内的代码实际上是在围栏内执行的行为。但是我看不出为什么spinlock变量本身不应该是易失性的。。。希望内核专家能够澄清这一点:)