多线程编程指南

等待线程终止

使用 thr_join(3C) 可以等待目标线程终止。对于 POSIX 线程,请参见pthread_join 语法

thr_join 语法

#include <thread.h>



int thr_join(thread_t tid, thread_t *departedid, void **status);

目标线程必须是当前进程的成员,而不能是分离线程或守护进程线程。

多个线程不能等待同一个线程完成,否则仅有一个线程会成功完成。其他线程将终止,并返回 ESRCH 错误。

如果目标线程已经终止,thr_join() 将不会阻塞对调用线程的处理。

thr_join,加入特定线程

#include <thread.h>



thread_t tid;

thread_t departedid;

int ret;

void *status;



/* waiting to join thread "tid" with status */

ret = thr_join(tid, &departedid, &status);



/* waiting to join thread "tid" without status */

ret = thr_join(tid, &departedid, NULL);



/* waiting to join thread "tid" without return id and status */

ret = thr_join(tid, NULL, NULL); 

如果 tid(thread_t)0,则 thread_join() 将等待进程中的任何非分离线程终止。换句话说,如果未指定线程标识符,则任何未分离的线程退出都将导致返回 thread_join()

thr_join,加入任何线程

#include <thread.h>



thread_t tid;

thread_t departedid;

int ret;

void *status;



/* waiting to join any non-detached thread with status */

ret = thr_join(0, &departedid, &status); 

通过在 Solaris thr_join() 中使用 0 来表示线程 ID,进程中的任何非分离线程退出时都将执行加入操作。departedid 表示现有线程的线程 ID。

thr_join 返回值

thr_join() 在成功运行后返回 0。如果检测到以下任一情况,thr_join() 将失败并返回对应的值。


ESRCH

描述:

未找到与目标线程 ID 对应的非分离线程。


EDEADLK

描述:

检测到死锁,或者目标线程的值指定了调用线程。