使用 thr_join(3C) 可以等待目标线程终止。对于 POSIX 线程,请参见pthread_join 语法。
#include <thread.h> int thr_join(thread_t tid, thread_t *departedid, void **status);
目标线程必须是当前进程的成员,而不能是分离线程或守护进程线程。
多个线程不能等待同一个线程完成,否则仅有一个线程会成功完成。其他线程将终止,并返回 ESRCH 错误。
如果目标线程已经终止,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()。
#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() 在成功运行后返回 0。如果检测到以下任一情况,thr_join() 将失败并返回对应的值。
ESRCH
描述:未找到与目标线程 ID 对应的非分离线程。
EDEADLK
描述:检测到死锁,或者目标线程的值指定了调用线程。