C++双线程带while循环加mutex锁后执行结果不一致问题
多线程加互斥锁后未交替执行的原因
std::mutex的唯一作用是保证共享资源的互斥访问,即同一时间最多只有一个线程能持有锁操作共享变量,它本身不提供任何执行顺序的保证,出现连续执行的情况是正常现象,核心原因如下:
- 操作系统的线程调度是抢占式的,默认场景下没有自定义优先级、调度策略的约束时,哪个线程能获取CPU时间片、能抢到锁完全由系统调度器决定。当一个线程释放锁后,它大概率还处于运行态、剩余自己的时间片,会立刻发起下一次加锁请求,比处于等待队列中的另一个线程更容易抢到锁,就会出现单个线程连续执行多次的情况。
- C++标准没有强制要求
std::mutex为公平锁。公平锁会严格按照线程申请锁的先后顺序分配锁的持有权,而默认的std::mutex是不公平锁,设计为不公平的核心目的是提升性能,避免频繁的线程上下文切换开销,但代价就是会出现刚释放锁的线程重复抢占锁的现象。 - 你的代码中两个线程在解锁后,下一次循环会立刻申请加锁,中间没有任何让出CPU的逻辑(比如调用
std::this_thread::yield()主动让出时间片),进一步放大了不公平锁的抢占优势,就更容易出现单个线程连续执行多次的情况。
如果需要实现两个线程严格交替执行,仅靠互斥锁是不够的,需要额外增加同步逻辑,比如配合std::condition_variable条件变量,或者使用两个信号量来控制两个线程的执行顺序。
内容的提问来源于stack exchange,提问作者AnDevi
相关产品推荐
相关产品推荐

