1

由于我一直在写一些多线程的代码,我想出了以下情况:

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

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

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

一般来说,这两种不同方法的优缺点是什么?

4

2 回答 2

1

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

使用一个读取器和一个写入器,实现无锁和无等待的 FIFO 循环缓冲区是微不足道的。

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

于 2011-10-25T14:34:13.673 回答
1

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

没有测试就很难对这样的事情做出性能判断。一方面,循环缓冲区由连续数组支持。如果读取器和写入器索引保持“接近”彼此,您将让每个线程不断地使共享缓存行无效。

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

我的猜测是,最好的选择取决于工作量。

于 2012-07-03T00:49:31.920 回答