Linux线程的join(线程等待)和detach(线程分离)

join

首先你要知道我们为什么需要线程等待。线程等待是因为:

  • 已经退出的线程,其空间没有释放,仍然在进程的地址空间内
  • 创建的新的线程可能会复用刚才退出的线程的地址空间

其实可以将线程等待类比于进程等待,要是子进程都退出了,而父进程还不知道,不能及时回收子进程的资源,就让子进程变成了一个僵尸进程,说到底我们的线程等待和进程等待都是为了回收资源,资源很宝贵我们不能随意浪费!

先看一下线程等待的函数原型及其参数:

	int pthread_join(pthread_t thread,void **value_ptr);

参数:

  • thread:线程ID
  • value_ptr:它指向一个指针,后者指向线程的返回值

函数作用:调用该函数的线程将挂起等待,知道ID为thread的线程终止。thread以不同的方式终止,通过pthread_join得到的终止状态是不同的

  • 如果thread线程通过return返回,value_ptr所指向的单元里存放的是thread线程函数的返回值
  • 如果thread线程被其它线程调用pthread_cancel异常终止掉,value_ptr所指向的单元里存放的是常数PTHREAD_CANCELED
  • 如果thread线程是自己调用pthread_exit终止的,value_ptr所指向的单元里存放的是传给pthread_exit的参数
  • 但是我们一般情况下是不关心thread线程的终止状态的,那么我们可以直接传入一个NULL给value_ptr

detach

在默认的情况下,我们创建的线程是joinable的,也就是说,在我们的线程退出之后,需要对其进行pthread_join操作,否则无法释放资源,造成内存泄漏,那么如果我们不关心线程的返回值,join就是一种负担,还得我们手动操作,这个时候我们让系统自动释放资源,我们就可以分离线程。

int pthread_detach(pthread_t thread);

函数原型如上,很好理解,只用传入一个线程ID就可以对想要分离的线程进行线程分离了,可以对任意线程进行分离(同一进程内),要是想要分离自己,传入一个pthread_self()即可

joinable和分离是冲突的,一个线程不能既是分离的又是joinable的

你可能感兴趣的:(Linux)