APUE之线程(二)

线程终止:

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

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

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

 (3)线程调用pthread_exit。

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

#include 
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 

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函数的无类型指针参数能传递的数值可以不止一个,该指针可以传递包含了更复杂信息的结构的地址,但是注意这个结构所使用的内存在调用者完成了分配以后仍然需要是有效的,否则就会出现无效或者非法的访问。

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

你可能感兴趣的:(环境编程_My,endeavor)