在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!)