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

我有一个关于原子操作的问题,以及它在 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++;

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

提前感谢您的宝贵时间!

【问题讨论】:

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

标签: c++ multithreading atomic


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多