如果两个原子fetch_add同时执行,将会发生什么?

时间:2018-07-29 12:51:29

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

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

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

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

1 个答案:

答案 0 :(得分:2)

即使1000个线程在“相同时间”执行fetch_add,结果仍然是1000。这是原子操作的全部要点:它们是同步的。

如果我们不得不担心任何原子操作不会被其他线程同步/看不到其他线程,那么我们就不必开始进行原子操作。

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