首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >真正的无锁MPMC环缓冲器?线程能够互相帮助以避免阻塞吗?

真正的无锁MPMC环缓冲器?线程能够互相帮助以避免阻塞吗?
EN

Stack Overflow用户
提问于 2022-04-03 12:09:12
回答 1查看 494关注 0票数 2

这个问题是由无锁进度保证提出的。所示的代码并不是完全无锁的。当队列不为空或未满时,每当挂起写入线程时,读取器线程将返回false,从而阻止整个数据结构取得进展。

对于真正无锁的环形缓冲区,正确的行为应该是什么?

通常,真正的无锁算法涉及一个阶段,其中一个抢占线程实际上试图帮助另一个线程完成一个操作。

有提到这种技术吗?如何为基于数组的MPMC队列实现?

我看了一些代码,它们也有类似的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-03 16:01:39

作为一个很好的例子,说明了跨线程辅助在实际生活中是如何工作的,请考虑通过按照以下思路更改liblfds算法可以获得一个无锁的MPMC队列:

使用3个柜台:

  • alloc_pos:已经启动的推送操作的总数。当推送开始时,这会以原子方式递增。
  • write_pos:所有较低位置的写操作都已完成。
  • read_pos:所有写在较低位置的物品都已经被消耗掉了。

在此方案中,由一个CAS在受影响的插槽中完成推送或pop操作。write_posread_pos变量是多余的。

因此,要推送,线程首先递增alloc_pos,然后将write_pos递增到它前面的所有插槽,它可以看到这些插槽是完整的。这是一个帮助--它正在完成以前在其他线程中启动的写操作。然后,线程必须扫描write_posalloc_pos之间的插槽,直到找到空闲的时隙,并设法将其保留在CAS中。

要弹出,读取器首先将read_pos增加到它可以看到的较低位置上的所有项目被消耗。再一次,这是一个帮助--完成先前的阅读。然后,它从read_pos扫描到alloc_pos,看看是否能够找到正在编写的项目。

正如注释中提到的那样,真正做到这一点很烦人,实现决策会牺牲性能,从而保证您需要的订单和可用性,以及跳过圈来防止ABA问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71725753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档