【发布时间】:2016-06-21 12:00:53
【问题描述】:
我想通过以下方式保护对资源的访问:
- 所有线程都可以并发读取,更新期间除外(如果更新不是原子的)。
- 只能为一个线程分配更新任务,直到下一次 需要更新。
这似乎是一个简单的问题,使用正确的lock,或者可能使所有操作都原子化,但我认为不是这样。
如果我只有一个用于更新的写锁(即ReaderWriterLockSlim),或者使用非锁定代码,则只有一个线程可以运行更新过程(或排队执行此操作)。如果我在检查资源是否需要更新之前使用锁定来阻塞线程,它们就不能并发执行,但会被有效地序列化。
我可以让特定线程执行资源的所有检查和更新,并利用ManualResetEvent 之类的东西来暂停其他读取线程,直到更新完成。 (或者,如果更新是作为原子操作实现的,则只需满足于具有特定的更新线程。)
但是,我不确定最佳实践,我想问一下您是否认为可以通过更少的努力来满足要求,或者我的任何假设是否都存在偏差。
【问题讨论】:
-
奇怪的问题。如果您的线程非常不守规矩,以至于您无法在代码中确保您只启动一次执行更新的线程,那么您也无法保证它们表现良好并正确使用 RWLS。添加额外的锁只会让你陷入僵局。这从来都不是一个真正的问题,不要让它成为一个问题。
-
你为什么要控制访问实例的线程?请随时解释您如何确定“这永远不是真正的问题”。似乎是一个奇怪的评论。
标签: c# multithreading concurrency locking