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