我有两种方法,比如read()
和init()
。
read
是可重入且线程安全的;它可以(并且应该)由多个线程并行执行。
但是,它们的任何其他组合都不是线程安全的;例如read
必须阻止init
正在执行,反之亦然,更不用提init
了。 (事情很复杂,因为它都是非托管代码的包装器。)
如何在这种情况下组织锁(在.net,C#或VB中)?
init
本身似乎微不足道:我可以将它包装在标准lock ()
/ SyncLock
机制中。但是有一个类似的简单机制允许read
:
init
的同一锁定对象,但不获取排他性(否则read
会阻止它自己)。init
应该阻止的对象(互斥?)(但read
我们不检查它)。 正如多线程中经常发生的那样,必定存在许多我不太熟悉的陷阱。例如,我看到read-lock对象可能被并行运行的多个读取多次标记,并且必须在init
之前完全展开。这一切都感觉像一个相当普遍的情况,必须有标准的处理方式......
答案 0 :(得分:0)
ReaderWriterLock或ReaderWriterLockSlim(在新代码中首选)类似乎是你想要的,你的init()方法是作者。
ReaderWriterLock用于同步对资源的访问。在任何 给定时间,它允许多个并发读访问 线程,或单个线程的写访问权限。在某种情况下 资源不经常更改,ReaderWriterLock提供更好 吞吐量比简单的一次性锁定,例如Monitor。
ReaderWriterLock在大多数访问读取时效果最佳,而 写入很少且持续时间很短。多个读者 与单一作家交替,既不是读者也不是作家 长期被阻止。
自1.1版以来,它一直是.NET框架的一部分,并记录在案here。