如果我们在条件变量之前放置一个互斥锁,那么有多少线程会等待它呢?

Posted

技术标签:

【中文标题】如果我们在条件变量之前放置一个互斥锁,那么有多少线程会等待它呢?【英文标题】:How can many threads wait on a condition variable if we place a mutex before it? 【发布时间】:2012-03-01 05:52:03 【问题描述】:

pthread_cond_broadcast 用于唤醒多个等待条件变量的线程。但是,同时也有人说我们应该在条件变量之前放置一个互斥体以避免竞争条件。

那么,如果有一个互斥锁,并且一个线程已经持有它并因此等待变量,那么任何其他线程如何持有相同的互斥锁(进入等待部分)?

【问题讨论】:

【参考方案1】:

当一个线程调用pthread_cond_wait() 时,它需要持有相关联的互斥锁。 API 将在阻塞线程时释放互斥锁。一旦 API 决定需要释放线程,它将在从 API 返回之前获取互斥锁。

保持互斥锁是必需的,因为检查条件然后调用pthread_cond_wait() 不是原子操作。互斥锁(以及正确使用互斥锁)可以防止线程在检查它和调用等待之间的短时间内错过条件变为真。

但是对具体问题(另一个线程如何获得互斥锁)的简短回答是,当线程在pthread_cond_wait() 中被阻塞时,互斥锁没有被持有。

【讨论】:

那么,你的意思是首先一个线程锁定一个互斥锁,然后开始等待并解锁同一个互斥锁? @Anisha: 是的,当线程在pthread_cond_wait() 中等待时,互斥锁已解锁。 Once the API decides the thread needs to be released, it will acquire the mutex before returning from the API 谁将获得互斥锁?线程? @Anisha: 是的 - 在 pthread_cond_wait() 返回特定线程之前,它将重新获取该线程上的互斥锁。 API会获取锁吗?

以上是关于如果我们在条件变量之前放置一个互斥锁,那么有多少线程会等待它呢?的主要内容,如果未能解决你的问题,请参考以下文章

多线程:互斥锁及多线程爬虫

用条件变量和互斥锁去管理线程池

UNIX网络编程:互斥锁和条件变量

信号量 互斥量 读写锁 条件变量

四十Linux 线程——线程同步之条件变量

Linux中 条件变量为啥要用互斥锁来保护?