我正在寻找一种具有以下特征的数据结构:
运作方式
行为
可选但很不错
我主要是并发数据结构的新手。是否存在这种数据结构的示例?环形缓冲区很有趣,但是我不认为它们可以是非阻塞的。链表很有前途,但是并发安全,无阻塞的要求使实现变得相当复杂。
我已经找到了一些有关使用原子CAS(比较和交换)操作实现非阻塞链表的好论文,但是固定大小的要求对此有些麻烦。也许该想法可以适应固定大小的列表?
对于它的值(value),我有兴趣在Ruby中使用它。我知道MRI具有全局解释器锁,这对于MRI来说有点用,但是其他Ruby运行时可以利用这一点,并且我将其视为提高我的并发编程技能的学习练习。
最佳答案
分析
这个问题可能更适合Software Engineering,而不是Stack Overflow上的此处,因为它似乎更多是设计问题。就是说,如果您无法重新设计应用程序以完全避免使用单个共享对象,则建议使用线程安全数组或将资源争用委派给MVCC数据库。
推荐建议
您可以使用Concurrent::Array和#unshift和#pop方法来实现线程安全列表或模拟循环缓冲区。您还可以选择将锁定外部化到数据库之类的东西,其中Ruby的GIL与底层队列或锁定机制无关。但是,据我所知,尽管实现自己的multiversion concurrency control可能很接近,但是无法在Ruby中创建真正的无锁并发访问对象。
悬而未决的成果可能是外部化了对PostgreSQL等MVCC-capable database的读取和写入。如果您不能这样做,则可能需要接受ACID properties固有的权衡以及应用程序和数据结构的性能特征。特别是,使用单个共享数据结构是您可能应该重新评估的设计决策。
在开始那条路之前,只需确保您要解决一个真正的性能问题。当然,在某些情况下,锁会增加明显的开销,但即使在混合使用Ruby的GIL的情况下,许多实际应用程序仍具有足够的性能。您的里程肯定会有所不同。
关于ruby - 并发的,非阻塞的,固定大小的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64081916/