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

使用Parallel.ForeachAsync操作共享变量时是否需要Mutex?

Parallel.ForEachAsync中共享变量的线程安全问题

是的,必须对这类共享变量(比如静态计数器)进行线程安全保护,但不需要用Mutex这么重量级的机制,具体细节如下:

  • 为什么需要保护:Parallel.ForEachAsync会在多个线程上并发执行委托,对共享变量的非原子操作(比如普通的counter++)本质是「读取-修改-写入」三步操作,并发场景下多个线程会互相干扰,导致竞态条件,最终得到错误的计数结果。

  • 推荐的轻量级解决方案:

    • 对于简单的计数场景,优先使用Interlocked类的原子操作方法,比如Interlocked.Increment(ref _staticCounter),它能保证整个递增操作是原子性的,不会被线程中断,性能远优于Mutex。
    • 如果需要对多个操作进行原子性保护,使用lock语句即可(进程内线程同步的首选),示例:
      private static readonly object _lockObj = new object();
      // 委托内的代码
      lock(_lockObj)
      {
          _staticCounter++;
          // 其他需要原子执行的操作
      }
      
  • 关于Mutex:Mutex主要用于跨进程的同步场景,在单个进程内的线程同步使用它会带来不必要的性能开销,完全没必要。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:52:02