首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否存在有界无锁阻塞队列?

是否存在有界无锁阻塞队列?
EN

Stack Overflow用户
提问于 2017-09-29 13:35:52
回答 1查看 1.4K关注 0票数 3

目前我们有LinkedBlockingQueue和ConcurrentLinkedQueue。

LinkedBlockingQueue可以是有界的,但它使用锁。

ConcurrentLinkedQueue不使用锁,但它不是有界的。而且它不会阻塞,这使得它很难轮询。

显然,我不能让一个既阻塞又无锁的队列(等待自由或非阻塞或其他)。我不要求学术上的定义。

有没有人知道一个队列实现,它基本上是无锁的(不在热路径中使用锁),在空的时候阻塞(不需要忙碌等待),并且是有界的(满的时候阻塞)?堆外解决方案也是受欢迎的。

我听说过LMAX Disruptor,但它看起来一点也不像队列。

我也很高兴知道非通用的解决方案(单生产者-单消费者,SPMC,MPSC)

如果没有已知的实现,我也很高兴知道可能的算法。

EN

回答 1

Stack Overflow用户

发布于 2017-09-30 01:41:56

无锁数据结构使用原子读写(例如compare-and-swap)来消除对锁的需求。当然,这些数据结构从不阻塞。

你所描述的是一个队列,它对非阻塞调用使用无锁机制,例如非空队列的remove(),而对空队列的remove()使用锁来阻塞。

正如您可能意识到的,这是不可能实现的。例如,如果在弹出操作之后,查看队列是否实际上是空的,然后继续阻塞,当您阻塞时,队列可能已经有一个或多个项目由另一个线程插入。

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

https://stackoverflow.com/questions/46482378

复制
相关文章

相似问题

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