为什么pthread_cond_signal导致死锁

时间:2015-01-11 15:37:08

标签: c++ c pthreads mutex condition-variable

我是条件变量的新手,如果不使用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)上,它什么都没打印。 谁能告诉我原因?感谢。

1 个答案:

答案 0 :(得分:0)

从手册页(我的重点):

  

pthread_cond_signal重新启动正在等待条件变量cond的其中一个线程。如果没有线程在cond上等待,则没有任何反应。 如果有多个线程正在等待cond,则只重新启动一个,但未指定哪个。

     

pthread_cond_broadcast重新启动等待条件变量cond的所有线程。如果没有线程在等待cond,则没有任何反应。

你的十个线程中的每一个都在等待相同的条件。您只需拨打go()一次 - 即main()。这会调用pthread_cond_signal,它只会发出一个线程(任意一个)的信号。所有其他人仍将等待,因此pthread_join挂起,因为他们不会终止。当您将其切换到pthread_cond_broadcast时,会触发线程的所有