2

使用比较和交换 (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 答案)。

4

1 回答 1

4

LL/SC 是由某些体系结构(例如 SPARC)实现的指令,用于形成更高级别的原子操作的基础。在 x86 中,您使用LOCK前缀来实现类似的目标。

为了避免 x86 上的 ABA 问题,LOCK您必须提供自己的保护以防止干预存储。一种方法是在相关内存附近存储一个代号(只是一个递增的整数)。每个更新程序都会进行足够广泛的原子比较/交换,以包含数据和序列号。只有找到正确的数据和正确的数字,更新才会成功。同时,它会更新数字,以便其他线程看到更改。

您会注意到 x86 一直 (?) 提供的指令宽度是可用于此目的CMPXCHG的机器字的两倍(请参阅CMPXCHG8B和后面的 )。CMPXCGH16B

于 2014-05-30T13:28:03.333 回答