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

互斥锁mutex是锁定自身,还是锁定临界区对应的内存访问位置?

问题解答

你的猜测完全正确,std::mutex 本身并不和任何共享资源做自动绑定,它仅作为独立的同步原语工作:仅当自身已经被其他线程持有时,才会阻塞后续尝试获取它的线程,操作系统、编译器都不会自动标记哪些内存位置是被某个mutex保护的,也不会主动拦截未持有mutex的线程访问对应的共享资源。

你给出的示例代码里,第二个线程跳过加锁直接操作GlobalVariable、调用GlobalFunction的行为属于C++标准明确定义的数据竞争(Data Race),是典型的未定义行为,实际运行时可能出现以下问题:

  • GlobalVariable的计数结果不符合预期:整数自增操作本身不是原子操作,可拆分为「读取旧值、计算新值、写回新值」三个步骤,两个线程并行执行时可能出现同时读取到同一个旧值、各自加1后写回,最终变量只累加了1次的错误
  • 若GlobalFunction内部也访问了其他全局共享资源,还可能触发逻辑异常、内存错误甚至程序崩溃等更严重的问题

补充说明

mutex和共享资源的保护对应关系完全是由开发者人工约定的,你需要在编码时自行遵守「所有访问某组共享资源的操作,都必须先持有对应的mutex」的规则,工具链不会帮你做自动检查和强制约束。
工业界的常用最佳实践是把mutex和它要保护的共享数据封装到同一个类的私有成员中,仅对外暴露加锁后的访问接口,从结构上避免漏加锁的风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:06:04