小编eak*_*s05的帖子

与ReaderWriterLockSlim并行的Parallel.ForEach死锁

我的应用程序中有一个有趣的死锁问题.有一个内存数据存储,它使用ReaderWriterLockSlim来同步读写.其中一种读取方法使用Parallel.ForEach在给定一组过滤器的情况下搜索商店.其中一个过滤器可能需要对同一商店进行恒定时间读取.这是产生死锁的场景:

更新:下面的示例代码.实际方法调用更新步骤
鉴于单一实例storeConcreteStoreThatExtendsGenericStore

  1. Thread1获取商店的读锁定 - store.Search(someCriteria)
  2. Thread2尝试使用写锁定来更新存储 - store.Update()- 阻塞Thread1
  3. Thread1对商店执行Parallel.ForEach以运行一组过滤器
  4. Thread3(由派生线程1的Parallel.ForEach)尝试恒定时读取的商店.它尝试获取读锁定但在Thread2的写锁定后被阻止.
  5. Thread1无法完成,因为它无法加入Thread3. 线程2无法完成,因为它阻止后面线程1.

理想情况下,如果当前线程的祖先线程已经具有相同的锁,我想要做的就是尝试获取读锁.有没有办法做到这一点?或者还有另一种/更好的方法吗?

public abstract class GenericStore<TKey, TValue>
{
    private ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
    private List<IFilter> _filters;  //contains instance of ExampleOffendingFilter

    protected Dictionary<TKey, TValue> Store { get; private set; }

    public void Update()
    {
        _lock.EnterWriterLock();
        //update the store
        _lock.ExitWriteLock();
    }

    public TValue GetByKey(TKey …
Run Code Online (Sandbox Code Playgroud)

c# deadlock readerwriterlockslim parallel.foreach

5
推荐指数
1
解决办法
1457
查看次数