【问题标题】:What will happen if two atomic fetch_add execute simultaneously?如果两个原子 fetch_add 同时执行会发生什么?
【发布时间】:2018-07-29 12:51:29
【问题描述】:

据我所知,cpp11 中的 atomic 类型的原子操作保证是 aomtic 的。但是,假设在多核系统中,如果两个线程同时进行以下操作,结果会是1吗?(假设最初是atomic<int> val=0;)看起来结果肯定是2,但为什么呢?

val.fetch_add(1,std::memory_order_relaxed);

作为补充,假设另一种情况,如果thread1做val.load(2); thread2做val.load(3),结果似乎是2还是3,但也不确定是哪一个。

【问题讨论】:

    标签: c++11 concurrency atomic memory-model memory-barriers


    【解决方案1】:

    即使有 1000 个线程“同时”执行fetch_add,结果仍然是 1000。这就是原子操作的重点:它们是同步的。

    如果我们不得不担心任何原子操作不会被其他线程同步/不可见,那么我们一开始就没有原子操作。

    当执行一个原子操作(如fetch_add)时,您可以保证在任何给定时间只有一个原子操作开始和结束,并且它不能被其他开始的原子操作重叠/中断其他线程。

    【讨论】:

    • 我知道原子操作没有中间状态。它们要么完成要么没有完成。但是我很困惑如果两个原子操作同时发生会发生什么。你的意思是原子操作不会同时发生?
    • 它们不能同时发生。一个线程将等到fetch_add 在另一个线程中完成。原子性 = 同步 + 可见性 + 内存顺序执行。
    • 谢谢,所以原子操作之间必须有一个发生顺序即使在多CPU系统中,但没有指定哪个先发生?
    • 对不起,我不明白你的问题。
    • 您说“原子性 = 同步 + 可见性 + 内存顺序执行”。但据我所知,宽松的顺序并不能保证与关系同步
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多