使用比较和交换 (CAS) 技术编写无锁代码时,会出现一个称为 ABA 问题的问题:
http://en.wikipedia.org/wiki/ABA_problem
仅在值“A”上进行比较是有问题的,因为在两个观察之间仍然可能发生写入。我继续阅读并找到了这个解决方案:
http://en.wikipedia.org/wiki/LL/SC
在计算机科学中,加载链接和条件存储 (LL/SC) 是多线程中用于实现同步的一对指令。加载链接返回内存位置的当前值,而随后对同一内存位置的存储条件将仅在加载链接后该位置没有发生更新时存储新值。这共同实现了无锁原子读-修改-写操作。
如何修改典型的 C++ 无锁 CAS 技术以使用上述解决方案?有人可以举一个小例子吗?
我不介意它是否特定于 C++11/x86、x86-64 Linux(最好没有 Win32 答案)。