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

C++双线程带while循环加mutex锁后执行结果不一致问题

多线程加互斥锁后未交替执行的原因

std::mutex的唯一作用是保证共享资源的互斥访问,即同一时间最多只有一个线程能持有锁操作共享变量,它本身不提供任何执行顺序的保证,出现连续执行的情况是正常现象,核心原因如下:

  • 操作系统的线程调度是抢占式的,默认场景下没有自定义优先级、调度策略的约束时,哪个线程能获取CPU时间片、能抢到锁完全由系统调度器决定。当一个线程释放锁后,它大概率还处于运行态、剩余自己的时间片,会立刻发起下一次加锁请求,比处于等待队列中的另一个线程更容易抢到锁,就会出现单个线程连续执行多次的情况。
  • C++标准没有强制要求std::mutex为公平锁。公平锁会严格按照线程申请锁的先后顺序分配锁的持有权,而默认的std::mutex是不公平锁,设计为不公平的核心目的是提升性能,避免频繁的线程上下文切换开销,但代价就是会出现刚释放锁的线程重复抢占锁的现象。
  • 你的代码中两个线程在解锁后,下一次循环会立刻申请加锁,中间没有任何让出CPU的逻辑(比如调用std::this_thread::yield()主动让出时间片),进一步放大了不公平锁的抢占优势,就更容易出现单个线程连续执行多次的情况。

如果需要实现两个线程严格交替执行,仅靠互斥锁是不够的,需要额外增加同步逻辑,比如配合std::condition_variable条件变量,或者使用两个信号量来控制两个线程的执行顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:09:03