功能/不可变数据结构是否仍然可用于非垃圾收集上下文中的并发?

时间:2011-08-31 06:43:08

标签: c++ data-structures concurrency functional-programming immutability

不可变数据结构的一个卖点是它们可以自动并行化。如果没有发生突变,则可以在线程之间传递对函数数据结构的引用而不进行任何锁定。

我开始思考如何在c ++中实现功能数据结构。假设我们在数据结构的每个节点上都有引用计数。 (功能数据结构在数据结构的旧成员和更新成员之间共享结构,因此节点不会唯一地属于一个特定数据结构。)

问题是如果在不同的线程中更新引用计数,那么我们的数据结构就不再是线程安全的。将互斥锁附加到每个节点都很昂贵,并且无法使用不可变数据结构来实现并发。

有没有办法让并发不可变数据结构在c ++(以及其他非垃圾回收环境)中工作?

2 个答案:

答案 0 :(得分:5)

有无锁参考计数算法,例如,参见Lock-Free Reference CountingAtomic Reference Counting Pointers

另请注意,C ++ 0x(很快可能会成为C ++ 11)包含原子整数类型,尤其是出于此类目的。

答案 1 :(得分:4)

好吧,垃圾收集语言也存在多线程环境的问题(对于可变结构来说并不容易)。

您忘记了与任意数据不同,计数器可以原子递增和递减,因此不需要互斥锁。它仍然意味着需要维护处理器之间的缓存同步,如果单个节点不断更新,这可能会花费很多。