用锁xchg混合锁xadd。有xchg的商店会丢失吗?

时间:2016-02-26 14:21:45

标签: c++ multithreading x86 lock-free stdatomic

在C ++代码中,但不是特定于C ++,可以很容易地用多种语言表达:

atomic<int> counter(0);

// Many threads
counter.fetch_add(1); // lock xadd

// One thread
std::lock_guard<std::mutex> lock(mutex);
counter.exchange(INT_MIN); // lock xchg

是否有可能执行一个执行,其中xadd在INT_MIN存储之前读取计数器的值,然后INT_MIN的存储发生,并且计数器clobbers INT_MIN的递增值 - 因此计数器可能永远不会变为负数(好吧,假设它没有环绕,无论如何都是未定义的。)

我想知道带有xchg的商店是否会“丢失”。如果是这样,我真的需要使用CAS而不是fetch_add。但是,我怀疑,因为锁xadd特别要防止丢失更新,它的执行不能与其他线程上的锁定指令交错(至少与其他锁xadd!)

0 个答案:

没有答案