由于我一直在编写一些多线程代码以获得乐趣,我想出了以下情况:
线程从内存池声明单个资源单元,它处理它并将指向此数据的指针发送到另一个线程,以便使用循环缓冲区进行进一步操作(1R / 1W情况)。
后者必须在收到数据时通知前一个线程,以便可以回收内存。
我想知道是否更好 - 性能方面 - 将这个“Freelist”实现为另一个循环缓冲区 - 保存空闲资源的地址 - 或选择无锁堆栈方式(在x86-64上实现DCAS)。 / p>
一般来说,两种不同方法的利弊可能是什么?
答案 0 :(得分:1)
以防万一,无锁和无等待之间存在差异。前者意味着没有锁定,但线程仍然可以忙 - 旋转没有取得任何进展。后者意味着线程总是在没有锁定或忙碌旋转的情况下取得进展。
使用一个读卡器和一个写入器无锁且无等待的FIFO循环缓冲区很容易实现。
我听说LIFO堆栈也可以等待,但对FIFO列表不太确定。听起来你需要一个队列而不是堆栈。
答案 1 :(得分:1)
主要的区别是循环缓冲区将是有界的,而堆栈则不会。
很难在没有测试的情况下对这样的事情做出性能判断。一方面,循环缓冲区由连续数组支持。如果读者和作者索引彼此“接近”,则每个线程都会不断使共享缓存行无效。
另一方面,对于堆栈,您可以争用堆栈顶部指针,导致线程有时在CAS循环中旋转。
我的猜测是,最好的选择是依赖于工作负载。