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