【发布时间】:2010-12-16 00:40:21
【问题描述】:
我今天花了很多时间研究无锁队列。我有多个生产者,多个消费者的情况。为了测试,我在 Win32 下使用 Interlocked SList 实现了一个系统,它使我的基于重线程任务的代码的性能翻了一番。但不幸的是,我希望支持多个平台。在多个平台上互锁本身不是问题,我可以放心地假设我可以毫无问题地互锁。然而,实际的实现让我迷失了。
最大的问题似乎是您需要保证列表推送/弹出将仅使用一个互锁调用。否则,您将留出空间让另一个线程咬入并将事情搞砸。我不确定微软的实现是如何在幕后工作的,我很想知道更多。
谁能告诉我有用的信息(平台和语言无关紧要)?
此外,我很想知道是否可以实现无锁向量。这对我有很大的用处:) 干杯!
编辑:阅读herb 的DDJ 文章后,我可以看到一个减少的锁定队列,这与我已经拥有的非常相似。但是我注意到最后有一些论文可以使用双重比较和交换(DCAS)操作进行真正的无锁队列。有没有人使用 cmpxchg8b (或 cmpxchg16b )实现队列?
此时我只是在沉思(尚未阅读论文),但您可以使用此系统同时更新头指针和尾指针,从而避免另一个线程在两个原子操作之间跳转的任何问题。但是,您仍然需要获取下一个头指针以针对尾指针进行测试,以查看您是否刚刚修改了尾。当另一个线程准备自己这样做时,如何避免另一个线程更改此信息?这究竟是如何以无锁方式实现的?还是我最好阅读研究论文的不可破译性? ;)
【问题讨论】:
-
很遗憾你没有回答这个问题 :) 我没有找到那个队列,此外,我没有找到 Herb Sutter 的多制作人/消费者 DDJ 文章 :) 谢谢!
标签: language-agnostic queue atomic lockless