在 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。但是,我怀疑由于 lock xadd 特别必须防止丢失更新,因此它的执行不能与其他线程上的锁定指令交错(至少与其他 lock xadd!)