调用pthread_mutex_lock申请已上锁互斥量时何时返回值?
问题解答
pthread_mutex_lock() 仅在两种情况下会返回值:要么成功拿到目标互斥量的所有权,要么调用触发了错误,阻塞等待期间不会有任何返回。
你描述的场景执行流程完全符合pthread标准定义,逻辑如下:
- 互斥量已经被第一个线程持有,处于锁定状态
- 第二个线程调用
pthread_mutex_lock()尝试加锁,此时函数不会返回,第二个线程直接进入阻塞状态,内核会将其暂时移出CPU调度队列,不占用运行资源 - 直到第一个线程调用
pthread_mutex_unlock()释放互斥量,内核会唤醒等待该互斥量的第二个线程,第二个线程成功拿到互斥量的所有权后,pthread_mutex_lock()才会返回0(成功状态码) - 若调用过程触发参数非法、死锁检测触发等异常,函数也会立即返回对应错误码,不会进入阻塞流程
调用pthread_mutex_lock()将锁定mutex指向的互斥量对象。若该互斥量已被锁定,调用线程将阻塞,直到互斥量变为可用状态。该操作返回时,mutex指向的互斥量对象处于锁定状态,且调用线程为其所有者。
官方描述里的「返回时互斥量处于锁定状态、调用线程为所有者」的说明也可以直接验证这个逻辑:如果函数在阻塞阶段就返回,那返回后调用线程根本没有持有互斥量,和标准定义完全冲突。
如果需要加锁失败不阻塞的逻辑,可以使用pthread_mutex_trylock()接口,该接口尝试加锁失败后会立刻返回EBUSY错误码,不会挂起调用线程。
内容的提问来源于stack exchange,提问作者African_king
相关产品推荐
相关产品推荐

