据我所知,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,但不确定是哪个。
答案 0 :(得分:2)
即使1000个线程在“相同时间”执行fetch_add
,结果仍然是1000
。这是原子操作的全部要点:它们是同步的。
如果我们不得不担心任何原子操作不会被其他线程同步/看不到其他线程,那么我们就不必开始进行原子操作。
在执行原子操作(例如fetch_add
)时,您可以确保在任何给定时间只有一个原子操作可以开始和结束,并且不能会被其他已完成的原子操作重叠/中断来自其他线程。