在无锁设置中是否可以实现多生产者、单消费者?

2024-03-13

我有一堆线程相互之间进行大量通信。 我希望这是无锁的。

对于每个线程,我希望有一个邮箱,其他线程可以在其中向其发送消息(但只有所有者可以删除消息)。这是多生产者单消费者的情况。我可以在无锁/高性能的情况下做到这一点吗? (这是一个巨大模拟的内循环。)


无锁多生产者单消费者 (MPSC) 队列是最容易实现的无锁算法之一。

最基本的实现需要一个简单的无锁单链表(SList),只有push()和flush()。这些函数在 Windows API 中以 InterlockedFlushSList() 和 InterlockedPushEntrySList() 的形式提供,但您自己也可以轻松实现这些函数。

多个生产者使用 CAS(互锁比较和交换)将项目推送到 SList 上。

单个消费者执行flush(),它使用XCHG(互锁交换)将SList 的头部与NULL 交换。然后,消费者将获得一个按相反顺序排列的项目列表。

要按顺序处理项目,您必须简单地反转从flush()返回的列表,然后再处理它。如果你不关心顺序,你可以简单地立即遍历列表来处理它。

如果您推出自己的函数,请注意以下两点:

1)如果您使用的系统内存排序较弱(即PowerPC),则需要在push()函数的开头放置一个“释放内存屏障”,并在flush()的末尾放置一个“获取内存屏障” ) 功能。

2) 您可以使函数大大简化和优化,因为 SList 的 ABA 问题发生在 pop() 函数期间。如果仅使用push() 和flush(),则SList 不会出现ABA 问题。这意味着您可以将其实现为与非无锁代码非常相似的单个指针,并且不需要 ABA 预防序列计数器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在无锁设置中是否可以实现多生产者、单消费者? 的相关文章