循环缓冲区。锁定自由堆栈以实现自由列表

时间:2011-10-25 14:10:12

标签: c stack lock-free circular-buffer

由于我一直在编写一些多线程代码以获得乐趣,我想出了以下情况:

线程从内存池声明单个资源单元,它处理它并将指向此数据的指针发送到另一个线程,以便使用循环缓冲区进行进一步操作(1R / 1W情况)。

后者必须在收到数据时通知前一个线程,以便可以回收内存。

我想知道是否更好 - 性能方面 - 将这个“Freelist”实现为另一个循环缓冲区 - 保存空闲资源的地址 - 或选择无锁堆栈方式(在x86-64上实现DCAS)。 / p>

一般来说,两种不同方法的利弊可能是什么?

2 个答案:

答案 0 :(得分:1)

以防万一,无锁和无等待之间存在差异。前者意味着没有锁定,但线程仍然可以忙 - 旋转没有取得任何进展。后者意味着线程总是在没有锁定或忙碌旋转的情况下取得进展。

使用一个读卡器和一个写入器无锁且无等待的FIFO循环缓冲区很容易实现。

我听说LIFO堆栈也可以等待,但对FIFO列表不太确定。听起来你需要一个队列而不是堆栈。

答案 1 :(得分:1)

主要的区别是循环缓冲区将是有界的,而堆栈则不会。

很难在没有测试的情况下对这样的事情做出性能判断。一方面,循环缓冲区由连续数组支持。如果读者和作者索引彼此“接近”,则每个线程都会不断使共享缓存行无效。

另一方面,对于堆栈,您可以争用堆栈顶部指针,导致线程有时在CAS循环中旋转。

我的猜测是,最好的选择是依赖于工作负载。