线程的终止

      线程终止有2种情况,第一种是线程函数执行完毕、从线程函数返回(通过return语句),第二种是通过调用函数pthread_exit()使线程退出。

      需要注意的是:

  • 在主线程中,如果从main函数返回或是调用了exit函数退出主线程,则整个进程将终止,显而易见进程中的所有线程也将终止,因此主线程不能过早从main函数返回。
  • 如果主线程调用了pthread_exit函数,则仅仅是主线程消亡,进程不会结束,进程内的线程也不会终止,直到所有线程结束,进程才会结束。
  • 线程终止最重要的问题是资源释放,尤其是临界资源,为一个线程独占,所以使用完毕要及时释放以便其他线程可以使用。
  • 线程的运行时互相独立的,线程的终止并不会互相通知,也不会影响其他线程。终止的线程占用的资源不会随着线程的终止而归还系统,仍为线程所在的进程所持有。
  • 类似于进程中使用的wait函数,函数pthread_join用来等待一个线程的结束。其调用者将被挂起并等待子线程终止。
  • 一个线程仅仅允许一个线程使用pthread_join()等待它的终止,并且被等待的线程应该处于可join状态,即非DETACHED状态。(DETACHED状态时指对某个线程执行pthread_detach()后所处的状态。处于此状态的线程无法由pthread_join()同步。)
  • 一个可“join”的线程所占用的内存仅当有线程对其执行了pthread_join()后才会释放,因此为了避免内存泄漏,所有线程终止时,要么已被设为DETACHED,要么使用pthread_join()来回收资源。

线程终止的实例:

#include <stdio.h>
#include <pthread.h>

void assisthread(void * arg)
{
	printf ("I am helping to do some jobs\n");
	sleep (3);
	pthread_exit (0);
}

int main(void)
{
	pthread_t	assistthid;
	int		status;

	pthread_create (&assistthid, NULL, (void *) assisthread, NULL);
	pthread_join(assistthid, (void *) &status);
	printf("assistthread's exit is caused %d\n", status);

	return 0;
}

运行结果:



      从执行情况看,“I am helping to do some jobs.”这行字打印出3秒之后,才会继续打印主线程中的“assistthread's exit caused 0”这行字,这说明语句pthread_join的确让主线程阻塞了,并且等待子线程执行完毕返回之后再继续往下执行。pthread_exit结束时的退出码是0,pthread_join得出的也为0,两者是一致的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值