防止线程不必要地执行昂贵的任务

时间:2016-06-21 12:00:53

标签: c# multithreading concurrency locking

我想以下列方式保护对资源的访问:

  • 除了更新期间(如果更新不是原子的),所有线程都可以并发读取。
  • 只有一个线程可以分配更新任务,直到下一次 需要更新。

这似乎是一个简单的问题,即使用正确的lock,或者可能使所有操作都是原子的,但我认为不是这样。

如果我只有一个用于更新的写锁(即ReaderWriterLockSlim),或者使用非锁定代码,则不会阻止多个线程运行更新过程(或排队等待)。如果我在检查资源是否需要更新之前使用锁定来阻塞线程,则它们不能并发执行,而是有效地序列化。

我可以让特定的线程执行资源的所有检查和更新,并利用像ManualResetEvent这样的东西来保持其他读取线程,直到更新完成。 (或者,如果更新是作为原子操作实现的,那么只需考虑具有特定的更新线程。)

但是,我不确定最佳做法,我想问一下你是否认为可以用更少的努力来满足要求,或者如果我在任何假设中都离开了。

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找ReaderWriterLockSlim。使用独占锁定模式进行书写。