首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >增量算子的原子性

增量算子的原子性
EN

Stack Overflow用户
提问于 2015-01-16 04:08:16
回答 2查看 398关注 0票数 6

在一次采访中,我被告知,在C中,使用++运算符(比如i++)是一个原子操作,而不是"i += 1“。我认为,在线程安全或原子性方面,这些操作完全相同。我是不是错过了什么,还是真的不一样?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-16 04:13:17

这是胡说八道。这两种方法都可能是原子的,也可能不是原子的,这取决于数据类型、体系结构和编译器(标准通常不会保证原子性,除非您使用的是C11原子),但我看不出有什么好的理由认为,一般来说,i++是原子的,而i += 1不是原子的。在不使用表达式结果的情况下,它们很可能实际上生成相同的代码。

票数 11
EN

Stack Overflow用户

发布于 2015-01-16 04:26:42

面试官错了。

我用gcc-4.8.2 -O2 -S编译了两个函数

代码语言:javascript
复制
void increment1(int *a) {
  *a += 1;
}
void increment2(int *a) {
  (*a)++;
}

两者都生成精确的the same程序集。

代码语言:javascript
复制
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)操作来实现原子增量。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27977145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档