Ste*_*sop 93
C标准没有定义它是否是原子的.
在实践中,你永远不会写代码,如果给定的操作,其失败是原子,但你可能会写代码失败,如果它不是.所以假设它不是.
Dev*_*lar 20
没有.
C语言标准保证唯一的原子操作是从类型的变量中分配或检索值sig_atomic_t
,定义于<signal.h>
.
(C99,第7.14章信号处理.)
Dig*_*oss 13
标准不保证.
因此,便携式程序不会做出假设.目前尚不清楚你的意思是"必须是原子的",还是"在我的C代码中恰好是原子的",而第二个问题的答案是它取决于很多事情:
并非所有机器都具有增量存储器操作.有些需要加载和存储值以便对其进行操作,因此答案是"从不".
在具有增量内存op的机器上,无法保证编译器无论如何都不会输出加载,增量和存储序列,或者使用其他非原子指令.
在具有增量存储器操作的机器上,相对于其他CPU单元,它可能是原子的,也可能不是原子的.
在具有原子增量存储器操作的机器上,它可能不被指定为体系结构的一部分,而只是CPU芯片的特定版本的属性,或者甚至仅仅是某些核心逻辑或主板设计的属性.
至于"我如何原子地做这个",通常有一种方法可以快速做到这一点,而不是诉诸(更昂贵)协商的互斥.有时,这涉及特殊的碰撞检测可重复代码序列.最好在汇编语言模块中实现这些,因为它无论如何都是特定于目标的,因此HLL没有可移植性优势.
最后,因为不需要(昂贵的)协商互斥的原子操作是快速且因此有用的,并且在任何情况下需要便携式代码,系统通常具有通常以汇编语言编写的库,其已经实现了类似的功能.