此问题涉及Posix系统的pthread API。
我的理解是,在等待条件变量,或者更具体地说是pthread_cond_t
时,流程会像这样。
// imagine the mutex is named mutex and the conditional variable is named cond
// first we lock the mutex to prevent race conditions
pthread_mutex_lock(&mutex);
// then we wait for the conditional variable, releasing the mutex
pthread_cond_wait(&cond, &mutex);
// after we're done waiting we own the mutex again have to release it
pthread_mutex_unlock(&mutex);
在这个例子中,当一些其他线程遵循这样的过程时,我们停止等待互斥锁。
// lock the mutex to prevent race conditions
pthread_mutex_lock(&mutex);
// signal the conditional variable, giving up control of the mutex
pthread_cond_signal(&cond);
我的理解是,如果多个线程正在等待,将应用某种调度策略,并且无论哪个线程都被解除阻塞,也会返回相关的互斥锁。
现在我不明白当一些线程调用pthread_cond_broadcast(&cond)
唤醒等待条件变量的线程的所有时会发生什么。
只有一个线程拥有互斥锁吗?在等待广播时,我是否需要以一种根本不同的方式等待,而不是等待信号(即不通过调用pthread_mutex_unlock
,除非我能确认此线程获得了互斥锁)?或者我完全理解互斥/关系如何运作是错误的?
最重要的是,如果(我认为可能就是这种情况)pthread_cond_broadcast
导致线程竞争关联的互斥锁,好像他们都试图锁定它一样,这是否只意味着一个线程真的会醒来吗?
答案 0 :(得分:3)
当某个线程在持有互斥锁的同时调用pthread_cond_broadcast
时,它会保留互斥锁。这意味着一旦pthread_cond_broadcast
返回,它仍然拥有互斥锁。
其他线程将全部唤醒,尝试锁定互斥锁,然后进入睡眠状态以等待互斥锁变为可用。
如果在不持有互斥锁时调用pthread_cond_broadcast
,则其他线程之一将能够立即锁定互斥锁。所有其他人都必须等待锁定互斥锁。