使用比较交换(CAS)技术编写无锁代码时,存在一个称为ABA问题的问题:
http://en.wikipedia.org/wiki/ABA_problem
因此,仅仅比较值"A"是有问题的,因为在两次观察之间可能会发生写操作。我继续阅读并找到了这个解决方案:
在计算机科学中,load-link 和 store-conditional(LL/SC)是一对指令,用于多线程同步。Load-link 返回内存位置的当前值,而后续的 store-conditional 只有在自从 load-link 以来该位置没有更新时才会存储新值。这样可以实现无锁原子读取-修改-写入操作。一个典型的 C++ 无锁 CAS 技术如何使用上述解决方案进行修改?有人能展示一个小例子吗?我不介意它是 C++11/x86,x86-64 Linux 特定(最好不要 Win32 的答案)。
CMPXCGH8B
或在64位系统上的CMPXCHG16B
更像是“双倍宽度 CAS”。通用CAS2将适用于非连续内存。 - Ben Jackson