一、线程的终止
1、线程终止不影响进程
- 线程可以简单的从启动程序中返回,返回值是线程的退出码
- 线程可以被同一进程的其他线程取消
- 线程调用pthread_exit
2、线程终止影响进程
- 任意线程调用了exit,_Exit,_exit或发送到线程就会终止进程的信号
二、线程终止函数pthread_exit
- 使用函数pthread_exit退出线程,这是线程的主动行为;由于一个进程中的多个线程是共享数据段的,因此通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放,但是可以用pthread_join()函数来同步并释放资源。
#include <pthread.h>
void pthread_exit(void *retval);
参数及返回值
- retval:指定传递给同进程不同线程的的值,那个线程调用pthread_join(3)可以接受这个值
- 返回值:无
三、线程汇合函数pthread_join(3)
- pthread_join可以自动把线程置于分离状态,这样资源就可以得到恢复
- 以阻塞的方式等待一个线程调用pthread_exit或者返回或者被取消,当函数返回,thread指定的线程的资源会被回收。如果线程已经结束,那么该函数会立即返回
- 当一个线程通过调用pthread_exit或者简单的返回时,其他线程可以使用pthread_join获取该线程的退出状态。pthread_join的retval参数被设置为NULL,pthread_join可以等待指定线程终止,但是不获取线程的终止状态。
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
参数返回值
- thread:指定了等待汇合的线程的id
- retval:线程结束的返回码(也就是终止状态),这里也可以传递更为复杂的内容,但是需要保证线程在退出之后这块内存还可以使用。
- 返回值
四、举例
#include <stdio.h>
#include <pthread.h>
void *thr_fn1(void *arg)
{
printf("thread 1 returning\n");
return((void *)1);
}
void *thr_fn2(void *arg)
{
printf("thread 2 returning\n");
pthread_exit((void *)2);
}
int main(void)
{
int err;
pthread_t tid1,tid2;
void *tret;//接收退出线程的终止状态
err = pthread_create(&tid1, NULL, thr_fn1, NULL);
if(0 != err)
{
printf("can't create thread 1\n");
}
err = pthread_create(&tid2, NULL, thr_fn2, NULL);
if(0 != err)
{
printf("can't create thread 2\n");
}
//等待线程的结束回收资源
err = pthread_join(tid1, &tret);
if(0 != err)
{
printf("can't join with thread 1\n");
}
/*打印线程退出返回的状态号,也就是返回值*/
/*这里应该打印的是 thread 1 exit code 1*/
printf("thread 1 exit code %ld\n", (long)tret);
err = pthread_join(tid2, &tret);
if(0 != err)
{
printf("can't join with thread 2\n");
}
/*这里应该打印的是 thread 1 exit code 2*/
printf("thread 1 exit code %ld\n", (long)tret);
return 0;
}
# ./exit
thread 1 returning //这个线程是return退出的
thread 2 returning //这是调用函数pthread_exit退出的
thread 1 exit code 1 //线程1结束退出以后pthread_join接收到该线程的退出状态
thread 1 exit code 2