非阻塞数据结构,多个读者,单个写入器

时间:2012-12-06 14:00:03

标签: c# task-parallel-library nonblocking

我有一个非常具体的场景:

  1. 多个(多核非多核)TPL任务(长时间运行,很可能是线程)想要以并行/重叠的方式读取数据集合(例如IDictionary)
  2. 一个Writer线程想要定期更新整个集合
  3. 最大限度地减少读者的延迟是第一目标,即使这意味着选择一个稍微陈旧的集合(即集合更新正在进行中)
  4. 读者必须完整地收集集合,部分更新的集合无效
  5. 最初的想法是避免(4)每次更新发生时都会创建一个新集合,一旦创建了编写器线程,就可以简单地更改给予读者的集合引用。隐含的假设是这将是一个原子操作,具有旧引用的读者将不受影响,并且新读者可以访问新的完整集合。

    我在尝试时获得了部分更新的集合,因此我需要知道这种方法是否可以继续进行...

1 个答案:

答案 0 :(得分:0)

自发布以来已经过了一段时间,但是IIRC我使用旧集合作为构造函数参数创建了一个新集合 - 即浅拷贝。

对这些元素进行适当的复制并使用这些元素实例化新容器,这样我就可以将数据项解耦,以确保不会发生“撕裂”。