dotNet中的锁定和多线程

时间:2009-06-29 21:20:14

标签: .net multithreading locking

我有多个线程都需要写入同一个字典。 我对我维护的对象进行了锁定,以确保只有一个线程一次更新字典。 我的问题如下。如果一个线程尝试更新字典而另一个线程有锁定,那么线程是否会知道等待?它会失败吗?如果线程只是等待,我可以避免太多的等待,有没有办法说最多五个theads可以排队,其余的只是继续?

3 个答案:

答案 0 :(得分:1)

如果一个线程持有一个锁,另一个线程尝试获取相同的锁,则第二个线程将等待。

线程只写,还是你有读操作?如果是这种情况,您应该使用ReaderWriterLockSlim(除非您已经这样做)。这将允许您并行读取多个线程,除非线程正在更新,在这种情况下它可以获得对资源的独占访问权。

答案 1 :(得分:0)

lock(obj)语句将阻止任何其他线程访问共享资源,直到该线程完成。

答案 2 :(得分:0)

锁本身不保护对象。锁可以保护其他线程不会获得相同的锁。因此,如果锁被设计为保护资源(如字典),那么其他线程必须合作并在访问资源(字典)之前获取相同的锁。如果一个线程忽略了这个并且访问资源的次数越少,那么它可能会在字典中遇到无效的瞬态状态,因此会遇到所有类型的错误。这适用于读写操作。 .Net中的集合类带有一个名为SyncRoot的属性,如果多线程访问被拒绝,它通常是所有线程使用的推荐对象。正如Fredrik已经指出的那样,有专门的ReaderWriter类型允许多个,共享,读取和单个独占写入。更复杂的方案,例如您引用的方案(如果有太多线程在等待资源,则避免操作)很难以完全安全和正确的方式进行编码,因此最好避免此类复杂情况并坚持基本原语。