Skip to main content
 首页 » 编程设计

c#之多级锁

2024年02月04日3898°冷暖

玩并行处理,我有一个 Parallel.For 循环,它对可枚举对象进行查找,如果找不到它要查找的内容,则添加它。但是,我一直遇到一个线程修改可枚举对象而另一个线程正在执行查找的问题,这使得它抛出异常。显而易见的解决方案是在查找和条目上都使用 lock,但这有点蛮力。我希望它能够运行多个并发查找,所以我不想在一个线程执行查找时完全锁定它,但我确实想在查找正在进行时禁止它执行添加。有什么办法可以实现这样的两级锁吗?

请您参考如下方法:

您可能想要使用 ReaderWriterLock .

private ReaderWriterLockSlim lock = new ReaderWriterLockSlim(); 
 
public string Read () { 
    lock.EnterReadLock (); 
    try { 
        return "xxx"; 
    } finally { 
        lock.ExitReadLock(); 
    } 
} 
 
public void Write () { 
    lock.EnterWriteLock (); 
    try { 
        // ... 
    } finally { 
        lock.ExiteWriteLock (); 
    } 
} 

多个线程可以拥有 ReaderWriterLock 的“读者”部分,但只有一个线程可以拥有“作者”部分(并且有作者时不能没有读者)。