在pthread_join()中阻塞

时间:2015-06-09 13:38:40

标签: c multithreading unix pthreads

根据手册页:

  

pthread_join()函数应暂停执行调用   线程直到目标线程终止,除非是目标线程   已经终止了。

因此,据我所知,调用进程将阻塞,直到指定的线程退出。

现在考虑以下代码:

pthread_t thrs[NUMTHREADS];

for (int i = 0; i < NUMTHREADS; i++)
{
    pthread_create(&thrs[i], NULL, thread_main, NULL);
}

pthread_join(thrs[0], NULL); /* will be blocked here */
pthread_join(thrs[1], NULL);
pthread_join(thrs[2], NULL);
/* ... */
pthread_join(thrs[NUMTHREADS - 1], NULL);

调用线程将在pthread_join(thrs[0], NULL)的调用中被阻止,直到thrs[0]以某种方式退出。但是,如果我们在调用thrs[2]时阻止pthread_exit()调用pthread_join(thrs[0], NULL),另一个线程如何?我们是否必须等待thrs[0]退出才能获得thrs[2]的返回值?

3 个答案:

答案 0 :(得分:4)

  

但是,如果另一个线程,如果我们被阻止,说[2]退出   调用pthread_join(thrs [0],NULL)?

是的,它可能会发生。在这种情况下,pthread_join(thrs[2], NULL);将立即返回。

  

我们是否必须等待[0]退出才能收到退货   价值[2]?

是的,您必须等待thr[0]终止。

(与问题没有直接关系)

没有必要在您创建的每个线程上调用pthread_join()。从线程获取返回状态是一个方便的功能。如果您不需要知道线程的终止状态,您可以 通过发布“已分离”属性来创建线程,或者从线程本身调用pthread_detach(pthread_self());以使其分离。 在某些情况下,您希望创建的线程继续执行但不再需要 main 线程。在这种情况下,您可以从主线程调用pthread_exit(NULL);,即使在主线程退出后也会让其他线程继续。

答案 1 :(得分:3)

是的 - thrs[0]上阻止的主要帖子在thrs[2]thrs[[0]退出后才会从thrs[1]获得结果。

如果你需要更多的灵活性,一个选择是做一些事情,比如让线程将结果发布在队列中,或者以线程需要连接的其他方式发出信号。主线程可以监视该队列/信号并获得必要的结果(可能来自pthread_join(),该线程在已知从队列/信号中的信息完成的线程上完成。

答案 2 :(得分:1)

是。代码是串行执行的。