一、线程
Linux线程创建函数为pthread_create(),默认规则是谁创建子线程,谁就要负责子线程的资源回收,当父线程退出后,子线程也随着退出。所以,一般情况下,父线程退出时都要确保子线程已经退出,所以会使用pthread_join()函数阻塞等待子线程的退出信号/标识。
pthread_detach(threadid)函数的功能是使线程ID为threadid的线程处于分离状态(可以为非父子关系),一旦线程处于分离状态,该线程终止时底层资源立即被回收;否则终止子线程的状态会一直保存占用系统的资源直到主线程调用pthread_join(threadid,NULL)获取线程的退出状态。被创建的子线程也可以自己分离自己,子线程调用pthread_detach(pthread_self())就是分离自己,因为pthread_self()这个函数返回的就是自己本身的线程ID。
1)父线程先于子线程终止
父线程先于子线程,则子线程为异常退出 ,那肯定没有使用阻塞非分离函数pthread_join,分2种情况:
a)子线程已与父线程分离,如调用线程分离函数pthread_detach,则资源被自动回收释放。
b)子线程未与父线程分离,则资源无法释放,造成了资源浪费和系统臃肿(这种情况,我看有些资料上说系统也能自动释放子线程的资源,如关闭描述符,释放内存空间等等,但个人做过一些测试,比如在子线程中分配很多空间等,进程退出后,top查看内存状态时还存在)。
深入分析父子线程、进程终止顺序不同产生的结果
最新推荐文章于 2023-02-20 21:47:11 发布