增量算子的原子性

sam*_*903 6 c atomic atomicity language-lawyer

我在接受采访时告诉我,在C语言中,使用++运算符(比如说i ++)是一个原子操作,而不是"i + = 1".我认为这些操作在线程安全性或原子性方面完全相同.我错过了什么或者这些实际上是不同的吗?

hob*_*bbs 10

这是胡说八道.根据数据类型,体系结构以及编译器(标准不保证一般的原子性,除非你使用的是C11原子),其中一个可能是也可能不是原子的,但我看不到任何有充分理由认为,一般情况下,i++原子i += 1不是原子.在不使用表达式结果的上下文中,它们很可能实际生成相同的代码.


dus*_*uff 8

语句*i++;i += 1;等效于C.两者都不保证是原子的.

特别是,大于系统字大小的变量的增量(例如,32位系统上的64位变量)几乎总是非原子的,因为原子地增加这样的变量通常需要显式锁定.此外,某些体系结构不支持直接在内存中递增变量.(也就是说,它们需要显式的加载/修改/存储序列.)这些体系结构不能在没有锁定的情况下以原子方式修改任何变量.

*当被视为独立语句时,而不是表达式