我正在使用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,以便主线程可以加入它以检索其退出状态?
答案 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) ;
......一切都非常简单,真的。