如何实施ABA解决方案?

时间:2012-06-05 17:08:01

标签: linux concurrency intel fifo lock-free

我正在尝试从here实现Michael-Scott FIFO队列。我无法为ABA问题实施他们的解决方案。我收到了这个错误。

error: incompatible type for argument 1 of '__sync_val_compare_and_swap'

作为参考,我使用的是一个linux框来在intel架构上编译它。如果您需要有关我的设置的更多信息,请询问。

似乎sync_val_CAS最多只能处理32位值。因此,当我删除用于消除ABA问题的计数器时,所有内容都会编译并运行正常。

有谁知道我应该在这里使用的相关64位CAS指令?

作为一个额外的问题,是否有更好(更快)的无锁fifo队列实现? Nir Shavit等人发现this这看起来很有趣。我想知道其他人是否也有类似的努力?感谢。

3 个答案:

答案 0 :(得分:0)

假设gcc,请尝试使用“march”开关。像这样:-march = i686

还有__sync_bool_compare_and_swap。我不知道它是否更快。

答案 1 :(得分:0)

GCC,最后我在2009年看过,不支持久负盛名的双字CAS。我必须实现内联汇编。

你可以在这里找到我对M& S队列的实现(包括在抽象层中DCAS的程序集实现)和其他无锁数据结构;

http://www.liblfds.org

简要地看一下Nir Shavit等人的论文,队列需要安全内存回收,我怀疑你需要实现它 - 它不会被内置到队列中。 SMR API将在下一个版本(几周)内提供。

答案 2 :(得分:0)

无锁可能不是您想要的,因为无锁无需等待。如果您需要快速线程安全队列(不是无锁!),请考虑使用Threading Building Blocks concurrent_queue