进程需要通过wait()系列函数等待资源回收,线程亦是如此。
pthread_join() 会阻塞调用线程,直到被等待的线程终止。这使得主线程可以确保所有子线程都完成其任务。通过 pthread_join,主线程可以获取子线程的返回值,允许在多线程间进行信息传递。pthread_join会在子线程结束后清理其资源,防止线程变成“僵尸线程”。
1.头文件
#include <pthread.h>
2.函数原型
int pthread_join(pthread_t thread, void **retval);
3.参数
thread:是一个类型为 pthread_t 的参数,表示要等待的线程的标识符。这个标识符通常是在调用 pthread_create() 时生成的。需要确保传入的 thread 是一个有效的线程标识符,如果该线程已经结束,pthread_join() 将立即返回。
retval:是一个指向指针的指针,用于接收线程的如果 pthread_join() 调用成功并成功等待到目标线程结束,则返回 0 会将线程返回的值存储在 *retval 中。如果不需要返回值,可以将此参数设置为 NULL。
4.返回值
pthread_join() 调用成功并成功等待到目标线程结束,则返回 0。调用失败,返回一个错误码。
5.注意事项
1)只能对可连接的线程调用:只能对 未分离的线程(即非分离状态)调用 pthread_join()。分离状态的线程在终止时会自动释放资源,不能被 pthread_join() 等待,否则会导致不可预期的行为。
2)避免对同一线程多次调用 pthread_join():多次对同一线程调用 pthread_join() 会导致不可预期的行为,因为线程在第一次调用 pthread_join() 后就会释放资源。如果有多个线程可能调用 pthread_join(),应设计合理的资源共享机制或使用其他同步手段。
3)避免主线程意外退出:若主线程(或创建线程的线程)在调用 pthread_join() 之前退出(例如 main() 提前返回),子线程将成为孤立线程并失去控制。因此,确保 pthread_join() 在主线程的生命周期内被正确调用,避免主线程提早退出。
4)pthread_join() 的阻塞性:pthread_join() 是阻塞调用,会一直等待目标线程结束。因此,若调用线程对性能敏感,避免阻塞或死锁,或是对多个线程调用 pthread_join() 时可考虑使用非阻塞的方式,如使用条件变量、信号量等。
5)释放返回值指针的内存:pthread_join() 会获取被连接线程的返回值指针 retval,若该指针指向动态分配的内存(例如 malloc()),调用线程应在适当时机释放内存,以避免内存泄漏。例如:
| void *retval;
pthread_join(thread, &retval); free(retval); // 释放返回值指针的内存 |
6)避免对自身调用 pthread_join():一个线程不能对自身调用 pthread_join(),否则会导致死锁。若希望实现线程自我管理,建议使用 pthread_detach() 将自身设置为分离状态。
7)检返回值:pthread_join() 返回值不为 0 时,表明连接操作失败,应根据错误码进行检查和处理。
193