【发布时间】:2011-10-25 14:10:12
【问题描述】:
由于我一直在写一些多线程的代码,我想出了以下情况:
一个线程从内存池中声明一个资源单元,它处理它并将指向该数据的指针发送到另一个线程,以便使用循环缓冲区进行进一步操作(1R / 1W 情况)。
后者必须在处理完他收到的数据时通知前一个线程,以便回收内存。
我想知道将这个“Freelist”实现为另一个循环缓冲区 - 保存空闲资源的地址 - 或者选择无锁堆栈方式(在 x86-64 上实现 DCAS)是否更好 - 性能方面。 /p>
一般来说,这两种不同方法的优缺点是什么?
【问题讨论】:
-
'后者必须在处理完他收到的数据后通知前一个线程,以便回收内存' - 为什么?为什么消费者线程不能将实例/结构/任何东西回收到池本身?为什么生产者线程必须这样做?如果有多个池,(例如,如果每个生产者都有自己的池),您可以在 struct/instance/whatever 中传递池实例/func-pointer/whatever,(老实说,这种东西很多,使用 OO 语言要容易得多,而且我们的开发人员不必在 cmets 中键入长的“结构/实例/指针”字符串)。
-
我对此很灵活:当我写这个问题时,我想到了一个模型,其中两个线程使用两个循环缓冲区来回通信。没有什么能阻止切换到它们都在内存池上运行的模型。我只是对这两种方法的优缺点感兴趣。
标签: c stack lock-free circular-buffer