首页 > 解决方案 > 一个关于原子操作的问题及其 c++ 说明

问题描述

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

std::atomic<int> my_value{0};
 
//...
// 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_value{0};
 
//...
// executed on thread 1
int a = m_value;
my_value++;

//...

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

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

在此先感谢您的时间 !

标签: c++multithreadingatomic

解决方案


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

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


推荐阅读