进程或线程等待mutex时的状态变化与所处状态咨询
关于Mutex等待的两个核心问题解答
嘿,这个问题问到点子上了,很多刚接触并发编程的同学都会被这块儿绕晕,我来给你讲得明明白白:
1. 进程/线程等待Mutex时会发生什么?
当一个线程(或进程,不过现在大多是线程级并发)尝试获取一个已经被其他线程持有的Mutex时,它会触发操作系统的调度机制,主动让出CPU使用权:
- 首先,这个线程会被从当前运行的CPU核心上剥离下来;
- 随后,它会被加入到这个Mutex对应的等待队列中,进入挂起状态;
- 操作系统此时会调度其他处于
READY状态的线程来占用CPU,避免空耗计算资源。
当然也有特殊情况,比如自旋锁(一种特殊的Mutex实现),线程会在用户态循环尝试获取锁,不会立刻让出CPU——但这种通常只用于锁持有时间极短的场景,一般我们说的“等待Mutex”默认指的是阻塞型的实现(比如POSIX的pthread_mutex_t、Windows的CriticalSection)。
2. 等待Mutex时处于何种状态?
明确答案:是阻塞(Blocked/WAIT)状态,绝对不是READY状态。
READY状态的线程是已经准备好执行,只等操作系统分配CPU时间片的;- 而等待Mutex的线程,因为缺少关键资源(Mutex的所有权),根本无法继续执行逻辑,所以会被操作系统挂起,直到持有Mutex的线程释放锁,操作系统才会把它从等待队列转移到
READY队列,等待下一次调度。
之前你搜不到清晰答案可能是因为不同操作系统对状态的命名略有差异(比如Linux叫TASK_INTERRUPTIBLE或TASK_UNINTERRUPTIBLE,Windows叫WAIT状态),但核心本质都是“阻塞挂起,无法被调度执行”。
内容的提问来源于stack exchange,提问作者Sajal




