我是条件变量的新手,如果不使用pthread_cond_broadcast()
则会出现死锁。
#include <iostream>
#include <pthread.h>
pthread_mutex_t m_mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cv = PTHREAD_COND_INITIALIZER;
bool ready = false;
void* print_id (void *ptr )
{
pthread_mutex_lock(&m_mut);
while (!ready) pthread_cond_wait(&cv, &m_mut);
int id = *((int*) ptr);
std::cout << "thread " << id << '\n';
pthread_mutex_unlock(&m_mut);
pthread_exit(0);
return NULL;
}
条件在这里改变了!
void go() {
pthread_mutex_lock(&m_mut);
ready = true;
pthread_mutex_unlock(&m_mut);
pthread_cond_signal(&cv);
}
如果我将go()
的最后一行更改为pthread_cond_broadcast(&cv);
int main ()
{
pthread_t threads[10];
// spawn 10 threads:
for (int i=0; i<10; i++)
pthread_create(&threads[i], NULL, print_id, (void *) new int(i));
go();
for (int i=0; i<10; i++) pthread_join(threads[i], NULL);
pthread_mutex_destroy(&m_mut);
pthread_cond_destroy(&cv);
return 0;
}
预期答案(任意顺序)是
thread 0
....
thread 9
然而,在我的机器(ubuntu)上,它什么都没打印。 谁能告诉我原因?感谢。
答案 0 :(得分:0)
从手册页(我的重点):
pthread_cond_signal
重新启动正在等待条件变量cond
的其中一个线程。如果没有线程在cond
上等待,则没有任何反应。 如果有多个线程正在等待cond
,则只重新启动一个,但未指定哪个。
pthread_cond_broadcast
重新启动等待条件变量cond
的所有线程。如果没有线程在等待cond
,则没有任何反应。
你的十个线程中的每一个都在等待相同的条件。您只需拨打go()
一次 - 即main()
。这会调用pthread_cond_signal
,它只会发出一个线程(任意一个)的信号。所有其他人仍将等待,因此pthread_join
挂起,因为他们不会终止。当您将其切换到pthread_cond_broadcast
时,会触发线程的所有。