Linux多线程之线程终止

  • 主动终止(终止自己)

调用 return (void*)var;
调用void pthread_exit(void *value_ptr), 其它线程可以调用 pthread_join 获得这个针。

注:
这两个函数返回值都为指针类型,在线程中使用时所指向的地址必须为:malloc分配的或者全局变量;因为当线程退出是 其作用域的变量都将消失。
这两个函数的返回值都能通过 int pthread_join(pthread_t thread, void **value_ptr) 获取,线程结束但线程所占用的资源并 没有立即释放调用该函数的线程将挂起等待, 等到线程结束且所占用的资源也就释放了。直到id为 thread 的线程终止。
thread 线程以不同的方法终止,通过 pthread_join 得到的终止状态是不同的,总结如下:

  1. 如果 thread 线程通过 return 返回, value_ptr 所指向的单元里存放的是 thread 线程函数的返回值。
  2. 如果 thread 线程被别的线程调用 pthread_cancel 异常终止掉, value_ptr 所指向的单元里存放的是常数 PTHREAD_CANCELED
  3. 如果 thread 线程是自己调用 pthread_exit 终止的, value_ptr 所指向的单元存放的是传给 pthread_exit 的参数。
  4. 如果对 thread 线程的终止状态不感兴趣,可以传 NULL 给 value_ptr 参数。
  • 被动终止
    个线程可以调用 pthread_cancel 终止同一进程中的另一个线程

  • 综合示例程序

#include
#include
#include
#include
typedef struct
{
    int var1;
    int var2;
}Arg;

void *th_fn1(void *arg)
{
	printf("thread 1 returning\n");
	return (void *)1;
}
void *th_fn2(void *arg)
{
	printf("thread 2 returning\n");
	pthread_exit((void *)2);
}
void *th_fn3(void *arg)
{
	while(1)
	{
		printf("thread 3 writing\n");
		sleep(1);
	}
}
void *th_fn4(void *arg)
{
    Arg *r=(Arg *)arg;
   
	printf("thread 1 returning\n");
	return (void *)r;              //强转
}

int main(void)
{
	pthread_t tid;
	void *tret;
   Arg r={10,20};
   
	pthread_create(&tid,NULL,th_fn1,NULL);
	pthread_join(tid,&tret);
    printf("thread 1 exit code %d\n",(int)tret);

	pthread_create(&tid,NULL,th_fn2,NULL);
	pthread_join(tid,&tret);
   printf("thread 2 exit code %d\n",(int)tret);   //细节   指针输出printf("%d\n",tret);即可输出tret地址存放的值

	pthread_create(&tid,NULL,th_fn3,NULL);
	sleep(3);
	pthread_cancel(tid);
	pthread_join(tid,&tret);
	printf("thread 3 exit code %d\n",(int)tret);
 //当执行函数返回自定义指针(arg)时的情况
    thread_create(&tid,NULL,th_fn4,(void *)&r);  //细节传自定义数组
	pthread_join(tid,(void **)&tret);
    printf("thread 4 exit code %d\n",((Arg *)tret)->var1+((Arg*)tret)->var2);  //强转
	return 0;
}
  • 运行情况
thread 1 returning
thread 1 exit code 1
thread 2 returning
thread 2 exit code 2
thread 3 writing
thread 3 writing
thread 3 writing
thread 3 exit code -1
thread 1 returning
thread 4 exit code 30

你可能感兴趣的:(Linux多线程编程)