繁体   English   中英

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

[英]Is there a bounded lock-free blocking queue?

目前我们有 LinkedBlockingQueue 和 ConcurrentLinkedQueue。

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

ConcurrentLinkedQueue 不使用锁,但它不受限制。 而且它不会阻塞,这使得轮询变得困难。

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

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

我听说过 LMAX Disruptor,但它看起来根本不像队列。

我也很高兴知道非通用解决方案(Single-Producer-Single-Consumer、SPMC、MPSC)

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

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

您所描述的是一个队列,它使用无锁机制进行非阻塞调用,例如remove()与非空队列,而使用锁阻塞例如remove()在空队列上。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM