线程的终止

一、线程的终止

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:线程结束的返回码(也就是终止状态),这里也可以传递更为复杂的内容,但是需要保证线程在退出之后这块内存还可以使用。
  • 返回值
    • 0 成功
    • 错误码 失败

四、举例

#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

猜你喜欢

转载自blog.csdn.net/weixin_38239856/article/details/83183992