Operating system 在pthread_cond_wait()中,为什么在使调用方睡眠时解锁互斥锁?

Operating system 在pthread_cond_wait()中,为什么在使调用方睡眠时解锁互斥锁?,operating-system,pthreads,condition-variable,Operating System,Pthreads,Condition Variable,我目前正在学习操作系统:三个简单的部分 它还引入了pthread_cond_wait()函数,使其调用者处于睡眠状态 它说,它在被调用后立即解锁互斥锁,然后让调用方睡眠 我不知道为什么在调用互斥锁后它会解锁互斥锁。为什么呢? 请帮我理解这个原因。 谢谢。如果它在调用方睡眠时保持互斥锁锁定,那么在pthread_cond_wait()返回并且调用方醒来并显式解锁互斥锁之前,其他线程将无法获取互斥锁。这种行为很难处理,因为如果互斥体也用于序列化对某些数据的访问,那么在第一个线程处于休眠状态时,其他线

我目前正在学习操作系统:三个简单的部分 它还引入了pthread_cond_wait()函数,使其调用者处于睡眠状态

它说,它在被调用后立即解锁互斥锁,然后让调用方睡眠

我不知道为什么在调用互斥锁后它会解锁互斥锁。为什么呢? 请帮我理解这个原因。
谢谢。

如果它在调用方睡眠时保持互斥锁锁定,那么在pthread_cond_wait()返回并且调用方醒来并显式解锁互斥锁之前,其他线程将无法获取互斥锁。这种行为很难处理,因为如果互斥体也用于序列化对某些数据的访问,那么在第一个线程处于休眠状态时,其他线程将无法安全地读取或写入该数据(因为如果在不锁定互斥体的情况下这样做,将引入竞争条件,并且如果它试图锁定互斥体,程序将死锁)。

当需要等待某个共享状态的值更改时,线程调用
pthread\u cond\u wait()
。该共享状态必须由互斥体保护,并且
pthread\u cond\u wait()
必须解锁互斥锁,以便其他线程有机会获取互斥锁并修改共享状态-否则,将出现死锁

线程在调用
pthread\u cond\u wait()
时必须持有互斥锁,否则另一个线程将有机会在等待的线程睡眠之前获取互斥锁并更改共享状态-这是一个“错过的唤醒”