一个关于原子操作的问题及其 c++ 说明

Posted

技术标签:

【中文标题】一个关于原子操作的问题及其 c++ 说明【英文标题】:A question about atomic operation and its c++ exposition 【发布时间】:2020-09-14 09:22:41 【问题描述】:

我有一个关于原子操作的问题,以及它在 c++ 中的阐述:

std::atomic<int> my_value0;
 
//...
// executed on thread 1
int a = my_value++;

//...

//executed  on thread 2
int b= my_value++;

对我来说,std::atomic::operator++ 确保 my_value == 2 ,但它也确保a=0, b=1 或 a=1, b=0 吗?强>

据我了解,只有增量操作是原子的,我以某种方式将此代码视为:

std::atomic<int> my_value0;
 
//...
// executed on thread 1
int a = m_value;
my_value++;

//...

//executed  on thread 2
int b= my_value;
my_value++;

但是我看到一些实现似乎假设做作和增量都是原子的......为什么,以及如何?

提前感谢您的宝贵时间!

【问题讨论】:

在第一个例子中 ++ 操作是原子的。在第二个中,每个 load 和 ++ 都是原子的,但它的组合不是(你也可以得到 a=0 b=0) 【参考方案1】:

据我了解,只有增量操作是原子的...

错了。 读取实际值和(后)增量都是单个原子操作。与fetch_add(1); 相同。注意操作名称中的“fetch”

【讨论】:

以上是关于一个关于原子操作的问题及其 c++ 说明的主要内容,如果未能解决你的问题,请参考以下文章

JUC中的原子操作类及其原理

c++中的原子操作

java中的原子操作类AtomicInteger及其实现原理

C++ 11 开发中的 Atomic 原子操作

C++ 11 开发中的 Atomic 原子操作

JDK的Atomic原子操作类实现机制