APUE之线程(二)

线程终止:

         如果进程中的任意一个线程调用了exit,_Exit,_exit,那么整个进程就会终止。单个线程可以通过一下三种方式退出,在不终止整个进程的情况下停止它的控制流。

 (1)线程返回,返回值是线程的退出码;

 (2)线程可以被同一进程中的其他线程取消;

 (3)线程调用pthread_exit。

#include <pthread.h>
void pthread_exit(void *rval_ptr);
   rval_ptr是一个无类型的指针。进程中的其他线程可以通过调用pthread_join函数访问这个指针。下面我补充一下对于pthread_join()函数进行一些介绍:

#include <pthread.h>
int pthread_join(pthread_t thread, void **rval_ptr);
          pthread_join() 以阻塞的方式等待指定的线程通过前面提到的三种方式结束。如果线程只是从他的启动线程返回,rval_ptr将包含返回码,如果线程被取消,由rval_ptr指定的内存单元就设置为PTHREAD_CANCELED。

       这么说吧,如果没有pthread_join()那么主线程结束,进程也就随之结束,从而使其他创建的线程还没有来得及执行就结束了,加入了pthread_join()函数以后,线程会等到相应的自己等待的线程结束之后才会结束。从而能够使创建的线程有机会执行。

下面补充一段线程退出的代码:

/*
 *Name : list11_2.c
 *Author : Lniper
 *Date : 2016-02-16
 *Aim : Getting the status of thread, when it exit.
 */
#include "apue.h"
#include "APUE_ERROR.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 exiting\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(err != 0)
		err_quit("can't create thread 1 : %s\n", strerror(err));
	err = pthread_create(&tid2, NULL, thr_fn2, NULL);
	if(err != 0)
		err_quit("can't create thread 2 : %s\n", strerror(err));
	
	/*
	 *pthread_join can get the status of pthread_exit function.
	 */
	err=pthread_join(tid1,&tret);												
	if(err != 0)
		err_quit("can't join with thread 1 :%s\n", strerror(err));
	printf("thread 1 exit code %d\n", (int)tret);
	err = pthread_join(tid2, &tret);
	if(err != 0)
		err_quit("can't join with thread 2 :%s\n", strerror(err));
	printf("thread 2 exit code %d\n", (int)tret);
	exit(0);
} 
       执行结果:


      我们可以看出当一个线程通过调用pthread_exit退出或者其他进程中返回的时候,进程中的其他线程可以通过调用pthread_join函数获得该线程的退出状态。此外,对于pthread_create和pthread_exit函数的无类型指针参数能传递的数值可以不止一个,该指针可以传递包含了更复杂信息的结构的地址,但是注意这个结构所使用的内存在调用者完成了分配以后仍然需要是有效的,否则就会出现无效或者非法的访问。

       对于线程退出还有一些没有写完,明天还要上班,等明天再续。。。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值