You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中lock与‘readonly lock’:多线程读写同步方案问询

C#多线程读写集合的高效锁实现问题

场景说明

我的应用中有多个线程(例如20个读线程)从集合读取数据,另有一个线程负责定期刷新该集合的数据。

使用普通lock的缺陷

使用标准lock语句时,所有读线程和写线程都会互相阻塞,同一时间仅能有一个读线程访问数据,示例代码如下:

private readonly object lockObj = new Object();
private List<string> data;

public void dataReader1(){
   lock(lockObj){
      // 读取操作...
   }
}

public void dataReader2(){
   lock(lockObj){
      // 读取操作...
   }
}

public void dataReader3(){
   lock(lockObj){
      // 读取操作...
   }
}

public void dataWriter(){
   lock(lockObj){
      // 写入操作...
   }
}

尝试的多锁方案(存在死锁风险)

为解决读线程互斥的问题,我尝试使用一个全局写锁和多个独立读锁:读线程可同时读取,写线程需先锁定所有读锁,再获取独占写锁。示例代码如下:

private List<string> data;

private readonly object writeLock = new Object();
private readonly object readLock1 = new Object();
private readonly object readLock2 = new Object();
private readonly object readLock3 = new Object();

public void dataReader1(){
   lock(readLock1){
      // 读取操作...
   }
}

public void dataReader2(){
   lock(readLock2){
      // 读取操作...
   }
}

public void dataReader3(){
   lock(readLock3){
      // 读取操作...
   }
}

public void dataWriter(){
   lock(readLock1){
      lock(readLock2){
         lock(readLock3){
             lock(writeLock){
                // 写入操作...
             }
          }
      }
   }
}

但这种嵌套锁的方式容易引发死锁,我并不满意该方案。

期望的原生实现逻辑

我希望C#能提供原生支持,通过单个锁对象实现多读单写的逻辑:

  • 多个读线程可同时进入readonly lock,仅当存在写锁(或正在尝试获取写锁)时才会阻塞
  • 写线程的普通lock需等待所有读锁释放后才能获取

设想的语法示例如下:

private readonly object lockObj= new Object();
private List<string> data;

public void dataReader1(){
   readonly lock(lockObj){
      // 读取操作...
   }
}

public void dataReader2(){
   readonly lock(lockObj){
      // 读取操作...
   }
}

public void dataReader3(){
   readonly lock(lockObj){
      // 读取操作...
   }
}

public void dataWriter(){
   lock(lockObj){
      // 写入操作...
   }
}

请问C#是否有原生方式实现这种逻辑?


内容的提问来源于stack exchange,提问作者dognose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:50:37