部分线程锁定:线程安全和不安全代码的混合

时间:2015-02-09 04:46:26

标签: .net multithreading

我有两种方法,比如read()init()

read是可重入且线程安全的;它可以(并且应该)由多个线程并行执行。

但是,它们的任何其他组合都不是线程安全的;例如read必须阻止init正在执行,反之亦然,更不用提init了。 (事情很复杂,因为它都是非托管代码的包装器。)

如何在这种情况下组织锁(在.net,C#或VB中)?

init本身似乎微不足道:我可以将它包装在标准lock () / SyncLock机制中。但是有一个类似的简单机制允许read

  1. 阻止用于init的同一锁定对象,但不获取排他性(否则read会阻止它自己)。
  2. 当块被释放时,除了自己的锁之外,还要标记另一个init应该阻止的对象(互斥?)(但read我们不检查它)。
  3. 运行代码。
  4. 释放第二个对象。
  5. 正如多线程中经常发生的那样,必定存在许多我不太熟悉的陷阱。例如,我看到read-lock对象可能被并行运行的多个读取多次标记,并且必须在init之前完全展开。这一切都感觉像一个相当普遍的情况,必须有标准的处理方式......

1 个答案:

答案 0 :(得分:0)

ReaderWriterLock或ReaderWriterLockSlim(在新代码中首选)类似乎是你想要的,你的init()方法是作者。

  

ReaderWriterLock用于同步对资源的访问。在任何   给定时间,它允许多个并发读访问   线程,或单个线程的写访问权限。在某种情况下   资源不经常更改,ReaderWriterLock提供更好   吞吐量比简单的一次性锁定,例如Monitor。

     

ReaderWriterLock在大多数访问读取时效果最佳,而   写入很少且持续时间很短。多个读者   与单一作家交替,既不是读者也不是作家   长期被阻止。

自1.1版以来,它一直是.NET框架的一部分,并记录在案here