pthread_join函数用法详解
pthread_join函数简介
- 头文件包含
#include <pthread.h>
- 函数定义
int pthread_join(pthread_t thread , void ** retval );
- 编译链接选项
-pthread
pthread_join函数常见使用错误
- 链接错误
undefined reference to `pthread_join'
解决办法:添加链接选项
-pthread
- 编译错误
warning: implicit declaration of function ‘pthread_join’ [-Wimplicit-function-declaration]
解决办法:包含头文件
#include <pthread.h>
pthread_join函数详细描述
pthread_join ()函数等待thread指定的线程终止。如果线程已经终止,那么pthread_join ()将立即返回。thread指定的线程必须是可接合的。
如果retval不为NULL,则pthread_join ()复制目标线程的退出状态(即,如果目标线程被取消,则目标线程提供给pthread_exit (3))的值将被复制到retval 指向的位置,然后 PTHREAD_CANCELED 将被放置在retval 指向的位置
如果多个线程同时尝试用同一线程联接,结果是未定义的。如果调用pthread_join ()的线程被取消,那么目标线程将保持可接合(即,它将不会被分离)。
pthread_join函数返回值
成功时,pthread_join ()返回0;出错时,它返回一个错误号。
pthread_join函数错误码
- EDEADLK 检测到死锁(例如,两个线程试图相互连接);或者thread指定调用线程。
- EINVAL thread不是可接合线程。
- EINVAL 另一个线程已在等待加入此线程。
- 找不到ID为thread的线程。
pthread_join函数其他说明
成功调用pthread_join ()后,调用方保证目标线程已经终止。然后,调用方可以选择在终止线程之后进行任何需要的清理(例如,释放分配给目标线程的内存或其他资源)。
与以前已联接的线程联接会导致未定义的行为。
如果不能与可接合的线程(即,未分离的线程)连接,则会产生“僵尸线程”。避免这样做,因为每个僵尸线程都会消耗一些系统资源,当僵尸线程积累足够多时,将不再可能创建新的线程(或进程)。
没有类似于"waitpid(-1\ &status\ 0)" 的pthreads,即“与任何终止的线程连接”。如果您认为您需要此功能,您可能需要重新考虑您的应用程序设计。
进程中的所有线程都是对等点:任何线程都可以与进程中的任何其他线程连接。
pthread_join函数使用举例
参见pthread_create (3)
评论区