我想通过以下方式保护对资源的访问:
- 所有线程都可以并发读取,更新期间除外(如果更新不是原子的)。
- 只能给一个线程分配更新任务,直到下一次 需要更新。
这似乎是一个使用适当的 lock
或可能使所有操作成为原子操作的简单问题,但我认为事实并非如此。
如果我只有一个用于更新的写锁(即 ReaderWriterLockSlim
),或者使用非锁定代码,没有什么可以阻止多个线程运行更新过程(或排队等待这样做) ).如果我在检查资源是否需要更新之前使用锁定来阻塞线程,它们将无法并发执行,但会被有效地序列化。
我可以让特定的线程执行资源的所有检查和更新,并利用类似 ManualResetEvent
的东西来暂停其他读取线程,直到更新完成。 (或者如果更新是作为原子操作实现的,只需满足于具有特定的更新线程。)
但是,我不确定最佳实践,我想问一下您是否认为可以用更少的努力来满足这些要求,或者我的任何假设是否有偏差。
最佳答案
我认为您正在寻找 ReaderWriterLockSlim
。使用独占锁模式写。
关于c# - 防止线程不必要地执行 CoSTLy 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37943872/