使用pthread_cond_t表示执行结束

时间:2014-09-06 21:54:03

标签: c pthreads pthread-join

我正在使用pthread_cond_t来表示子线程执行到主线程的结束。由于我没有同步对共享资源的访问,我想知道包含pthread_cond_wait的循环是什么?这就是我所拥有的:

pthread_mutex_t mutex;
pthread_cond_t cond;

int main(int argc, char *argv[])
{
        pthread_cond_init(&cond, NULL);
        cond = PTHREAD_COND_INITIALIZER;

        pthread_create(&tid1, NULL, func1, NULL);
        pthread_create(&tid2, NULL, func2, NULL);

        pthread_mutex_lock(&mutex);
        pthread_cond_wait(&cond, &mutex);
        pthread_mutex_unlock(&mutex);

        //Join the thread that first completes

}

void *func1(void *arg)
{
        ....
        pthread_cond_signal(&cond);
        pthread_exit((void *) 1);
}

void *func2(void *arg)
{
        ....
        pthread_cond_signal(&cond);
        pthread_exit((void *) 1);
}

默认情况下,主线程是否会等到thread1或thread2发送信号,或者我们是否需要围绕等待的某种条件循环?

另外,主线程如何在没有显式调用pthread_join的情况下访问发出信号的线程的退出状态?或者,有没有办法获取发出信号的线程的thread_id,以便主线程可以加入它以检索其退出状态?

1 个答案:

答案 0 :(得分:1)

如果两个线程在主线程到达pthread_cond_wait()之前运行完成,那么它将永远等待。否则,主线程将等待,直到其他线程之一发出信号为止。

不,你不能问问发信号的情况。

你的pthread条件没有记忆;如果没有线程在发出信号时等待该条件,则不会记住该信号。重要的是状态管理,受互斥锁保护。 pthread条件只是允许线程在状态需要时等待的机制。

因此,无论您需要从子线程传递给父线程的信息,诀窍都是在互斥锁下执行此操作。在这种情况下,您希望传递子项已完成的事实。也许是一个简单的bool,所以主线程:

  pthread_mutex_lock(&mutex) ;
  while (!t1_done && !t2_done)
    pthread_cond_wait(&cond, &mutex) ;
  pthread_mutex_unlock(&mutex) ;

并解决第一个问题:

  pthread_mutex_lock(&mutex) ;
  t1_done = true ;
  pthread_cond_signal(&cond) ;
  pthread_mutex_unlock(&mutex) ;

......一切都非常简单,真的。