C#复杂的线程同步

时间:2014-01-12 11:09:40

标签: c# multithreading

我有非常复杂的线程同步情况。我有一个从不同的线程访问的集合。一个线程,我们将其命名为“控制线程”,更新集合。其他线程读取集合('读取线程')。我想要实现的逻辑如下:

  1. 读取线程可以同时读取集合。
  2. 当Control线程需要更新集合时:
    • 在所有正在使用集合的读取线程完成其工作之前,控制线程不应启动更新。
    • 但是当Control线程正在等待读取线程时,其他未开始使用集合的读取线程也不应该启动 - 它们应该等到Control thread更新集合。
  3. 我应该使用什么线程同步技术?

2 个答案:

答案 0 :(得分:4)

只需看看ReaderWriterLock类,它定义了一个支持单个编写器和多个读者的锁,或者你可以使用ReaderWriterLockSlim(在.Net 4.0中支持),如果你开始一个更方便新开发(例如,它避免了许多潜在的死锁案例)

来自MSDN

  

ReaderWriterLockSlim类似于ReaderWriterLock,但它简化了递归规则以及升级和降级锁定状态的规则。 ReaderWriterLockSlim避免了许多潜在的死锁案例。此外,ReaderWriterLockSlim的性能明显优于ReaderWriterLock。建议将ReaderWriterLockSlim用于所有新开发。*

答案 1 :(得分:4)

使用ReaderWriterLockSlim班级:

  

表示用于管理资源访问的锁,   允许多个线程进行读取或独占访问以进行写入。

     

使用ReaderWriterLockSlim保护读取的资源   多个线程,一次由一个线程写入。   ReaderWriterLockSlim允许多个线程处于读取模式,   允许一个线程处于写入模式,具有独占所有权   锁定,并允许一个具有读访问权限的线程可以升级   读取模式,线程可以从中升级到写入模式   必须放弃对资源的读访问权。

Joe Albahari的Threading in C#是一个很好的资源。