锁定变量时,必须将其锁定到处吗?

Ale*_*lex 4 c# multithreading

我想知道当从多个线程访问变量时,是否必须为每次访问锁定它?例如,我有一个列表变量,并希望在我从中删除项目时无法访问该列表.我必须锁定它,即使在只访问数据的线程中,或者足以将其锁定在"删除项目"线程中.我担心的是,如果一个线程访问该列表在进程中间停止,则转到另一个从列表中删除并锁定该变量的线程,将出现一个错误.

Eri*_*ert 13

你的浴室门没有锁.相反,它有一个双面标志,一边说"占用",另一边说"没人".当有人接近浴室时,如果它被标记为已占用,则等待它被标记为无人居住.如果它被标记为空闲,他们将标志设置为占用并进入.当他们离开时,他们将标志设置为无人居住.

(一些谈判机制也必须存在,以处理有两个或两个以上的人等待的情况 - 谁先进入?还有,当两个人同时接近一个未占用的浴室时会发生什么 - 谁赢了?但我们会忽略那些皱纹;它们与这个类比没有密切关系.)

这个方案运作得很好.你的问题是"如果有人忽略了这个标志,或者忘了改变标志,我是否会遇到同时在浴室里有两个人的情况?"

是的,显然你可以.如果你不相信我,那么我鼓励你在浴室里尝试一下,看看当有人忽略这个协议时会发生什么.如果每个人都遵守协议,资源访问协议仅保护对该资源的访问!


Mit*_*eat 10

如果您希望将集合保持在一致状态(或使用锁保护的任何其他对象),则必须锁定读取和写入.

有一些"例外",比如使用ReaderWriterSlimLock,您仍需要获取写入锁,但您可以有效地执行多线程读取:

使用ReaderWriterLockSlim来保护由多个线程读取并由一个线程一次写入的资源.ReaderWriterLockSlim允许多个线程处于读取模式,允许一个线程处于具有锁独占所有权的写模式,并允许一个具有读访问权限的线程处于可升级读模式,线程可以从该模式升级到写模式必须放弃对资源的读访问权.