在 pthread_cond_wait() 中,为什么它在调用者睡眠时解锁互斥量?
In pthread_cond_wait() , why it unlock the mutex when it makes caller sleep?
我目前正在学习 OS 操作系统:三个简单的部分
并且它引入了 pthread_cond_wait() 函数,这使得它的调用者睡眠。
它说,它会在调用后立即解锁互斥锁,然后让调用者休眠。
我不知道为什么它在调用后解锁互斥体。这是为什么?
请帮助我理解这个原因。
谢谢。
如果它在调用者休眠时锁定互斥锁,则在 pthread_cond_wait() 返回并且调用者醒来并显式解锁互斥锁之前,没有其他线程能够获取互斥锁。这种行为很难处理,因为如果互斥量也被用于序列化对某些数据的访问,那么当第一个线程处于休眠状态时,没有其他线程能够安全地读取或写入该数据(因为如果它这样做了如果不锁定互斥量,那会引入竞争条件,如果它试图锁定互斥量,程序就会死锁。
线程在需要等待某些共享状态的值更改时调用 pthread_cond_wait()
。该共享状态必须由互斥锁保护,并且 pthread_cond_wait()
必须解锁互斥锁,以便另一个线程有机会获取互斥锁并修改共享状态 - 否则,您将陷入死锁。
线程在调用 pthread_cond_wait()
时必须持有互斥锁,否则另一个线程将有机会在等待 之前获取互斥锁并更改共享状态线程休眠 - 这是一个 "missed wakeup".
我目前正在学习 OS 操作系统:三个简单的部分 并且它引入了 pthread_cond_wait() 函数,这使得它的调用者睡眠。
它说,它会在调用后立即解锁互斥锁,然后让调用者休眠。
我不知道为什么它在调用后解锁互斥体。这是为什么? 请帮助我理解这个原因。 谢谢。
如果它在调用者休眠时锁定互斥锁,则在 pthread_cond_wait() 返回并且调用者醒来并显式解锁互斥锁之前,没有其他线程能够获取互斥锁。这种行为很难处理,因为如果互斥量也被用于序列化对某些数据的访问,那么当第一个线程处于休眠状态时,没有其他线程能够安全地读取或写入该数据(因为如果它这样做了如果不锁定互斥量,那会引入竞争条件,如果它试图锁定互斥量,程序就会死锁。
线程在需要等待某些共享状态的值更改时调用 pthread_cond_wait()
。该共享状态必须由互斥锁保护,并且 pthread_cond_wait()
必须解锁互斥锁,以便另一个线程有机会获取互斥锁并修改共享状态 - 否则,您将陷入死锁。
线程在调用 pthread_cond_wait()
时必须持有互斥锁,否则另一个线程将有机会在等待 之前获取互斥锁并更改共享状态线程休眠 - 这是一个 "missed wakeup".