在pthread_cond_broadcast之后哪个线程拥有关联的互斥锁?

时间:2016-01-18 02:42:36

标签: c multithreading pthreads posix mutex

此问题涉及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导致线程竞争关联的互斥锁,好像他们都试图锁定它一样,这是否只意味着一个线程真的会醒来吗?

1 个答案:

答案 0 :(得分:3)

当某个线程在持有互斥锁的同时调用pthread_cond_broadcast时,它会保留互斥锁。这意味着一旦pthread_cond_broadcast返回,它仍然拥有互斥锁。

其他线程将全部唤醒,尝试锁定互斥锁,然后进入睡眠状态以等待互斥锁变为可用。

如果在持有互斥锁时调用pthread_cond_broadcast,则其他线程之一将能够立即锁定互斥锁。所有其他人都必须等待锁定互斥锁。