在一次采访中,我被告知,在C中,使用++运算符(比如i++)是一个原子操作,而不是"i += 1“。我认为,在线程安全或原子性方面,这些操作完全相同。我是不是错过了什么,还是真的不一样?
发布于 2015-01-16 04:13:17
这是胡说八道。这两种方法都可能是原子的,也可能不是原子的,这取决于数据类型、体系结构和编译器(标准通常不会保证原子性,除非您使用的是C11原子),但我看不出有什么好的理由认为,一般来说,i++是原子的,而i += 1不是原子的。在不使用表达式结果的情况下,它们很可能实际上生成相同的代码。
发布于 2015-01-16 04:26:42
面试官错了。
我用gcc-4.8.2 -O2 -S编译了两个函数
void increment1(int *a) {
*a += 1;
}
void increment2(int *a) {
(*a)++;
}两者都生成精确的the same程序集。
increment1:
.LFB0:
.cfi_startproc
addl $1, (%rdi)
ret
.cfi_endproc
.LFE0:
.size increment1, .-increment1
.p2align 4,,15
.globl increment2
.type increment2, @function
increment2:
.LFB1:
.cfi_startproc
addl $1, (%rdi)
ret
.cfi_endproc但是在更精确的技术tarm中,两者都是atomic write,这意味着它没有提供MAD结果。如果在32位或更少位的CPU环境中使用int64_t变量,64位的修改会导致多次写入操作。它不能是没有锁的atomic write。
在gcc环境下,您可以使用__sync_fetch_and_add(&a, 1)操作来实现原子增量。
https://stackoverflow.com/questions/27977145
复制相似问题