我正在尝试从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这看起来很有趣。我想知道其他人是否也有类似的努力?感谢。
答案 0 :(得分:0)
假设gcc,请尝试使用“march”开关。像这样:-march = i686
还有__sync_bool_compare_and_swap。我不知道它是否更快。
答案 1 :(得分:0)
你可以在这里找到我对M& S队列的实现(包括在抽象层中DCAS的程序集实现)和其他无锁数据结构;
简要地看一下Nir Shavit等人的论文,队列需要安全内存回收,我怀疑你需要实现它 - 它不会被内置到队列中。 SMR API将在下一个版本(几周)内提供。
答案 2 :(得分:0)
无锁可能不是您想要的,因为无锁无需等待。如果您需要快速线程安全队列(不是无锁!),请考虑使用Threading Building Blocks concurrent_queue。