使用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
相关产品推荐
相关产品推荐

