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

C#多线程中如何锁定多个临界区?Mutex使用相关疑问

C#多线程中Mutex的使用疑问

我正在学习C#多线程技术,了解到Mutex类可用于线程同步。我计划使用限制为10个线程的ThreadPool,由于代码中存在调用数据库及多个Web服务的多个临界区,需要保证同一时间仅一个线程访问这些外部资源。我当前在类中仅使用一个Mutex实例,示例代码如下:

Mutex mutex = new Mutex(true);

//method for DB Access
private void callDB()
{
    mutex.WaitOne();
    //Do DB Call
    mutex.ReleaseMutex();
}

//method for WS1
private void callWS1()
{
    mutex.WaitOne();
    //Do WS Call
    mutex.ReleaseMutex();
}

现存在以下疑问:

  1. 若线程1调用callDB并释放Mutex后,再调用callWS1并锁定Mutex,会发生什么?
  2. Mutex是阻塞整个类(及其他线程)还是仅针对指定临界区?
  3. 若要在代码不同位置使用Mutex,是否需要创建多个实例?有没有更优的解决方案?

问题解答

1. 线程1调用callDB释放后再调用callWS1的情况

线程1在callDB中释放Mutex后,该锁会回到未占用状态。当线程1接着调用callWS1执行mutex.WaitOne()时:

  • 如果此时没有其他线程持有该Mutex,线程1会立即获取锁,进入callWS1的临界区执行Web服务调用。
  • 如果这期间已有其他线程(比如线程2)通过callDB或callWS1获取了Mutex,线程1会被阻塞,直到对方释放锁后才能继续执行。

2. Mutex的阻塞范围

Mutex不会阻塞整个类,它只针对被WaitOne()和ReleaseMutex()包裹的代码段(即你定义的临界区):

  • 类中未使用该Mutex的方法或代码,完全不受影响,多线程可正常并行执行。
  • 只有当多个线程同时尝试进入被同一个Mutex保护的临界区时,才会触发阻塞:同一时间仅一个线程能持有Mutex,其他线程会在WaitOne()处等待,直到锁被释放。

3. 多个位置使用Mutex的方案及更优解

是否需要多个Mutex实例?

取决于你的同步需求:

  • 如果所有外部资源(DB、各Web服务)需要全局互斥——同一时间只能有一个线程访问其中任意一个资源,单个Mutex实例完全够用,无需创建多个。
  • 如果不同资源允许并行访问(比如允许一个线程访问DB的同时,另一个线程调用Web服务),则需要为每个独立资源/临界区创建单独的Mutex实例,避免不必要的阻塞,提升并发效率。

更优解决方案

在C#进程内线程同步场景中,Mutex并非最优选择——它是跨进程的同步原语,开销远大于进程内同步工具。更合适的方案有:

  • lock关键字(基于Monitor类):进程内同步最常用的方式,语法简洁、开销小。可以用一个私有对象作为锁:
    private readonly object _lockObj = new object();
    
    private void callDB()
    {
        lock(_lockObj)
        {
            //Do DB Call
        }
    }
    
    private void callWS1()
    {
        lock(_lockObj)
        {
            //Do WS Call
        }
    }
    
  • SemaphoreSlim:如果后续需要调整并发数(比如允许2个线程同时访问外部资源),它比Mutex更灵活,同样适配进程内场景。

另外注意:你示例代码中Mutex mutex = new Mutex(true);的true参数表示创建时直接获取锁,这会导致其他线程初始无法进入临界区,需手动调用一次ReleaseMutex()释放初始锁,需根据实际需求调整,避免死锁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:07:24