一、主动终止
线程的执行函数中调用return语句
调用pthread_exit()
二、被动终止
1、线程可以被同一进程的其他线程取消,其它线程调用pthread_cancel(pthid)。
2、线程终止的3种方式
#include <pthread.h>
int pthread_cancel(pthread_t tid);
void pthread_exit(void *retval);
int pthread_join(pthread_t th,void **thread_return);
返回值: 成功返回0,否则返回错误编号
pthread_cancel
线程可以被同一进程的其他线程取消,tid为被终止的线程标识符。
pthread_exit
retval:pthread_exit调用者线程的返回值,可由其他函数和pthread_join来检测获取。
线程退出时使用函数pthread_exit,是线程的主动行为。由于一个进程中的多个线程共享数据段,因此通常在线程退出后,退出线程所占用的资源并不会随线程结束而释放。所有需要pthread_join函数来等待线程结束,类似于wait系统调用。
pthread_join
th:被等待线程的标识符
thread_return:用户定义指针,用来存储被等待线程的返回值
示例代码:
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
typedef struct
{
int d1;
int d2;
}Arg;
void* th_fn(void *arg)
{
Arg *r = (Arg*)arg;
return (void*)(r->d1 + r->d2);
}
int main()
{
int err;
pthread_t th;
Arg r = {20, 50};
if((err = pthread_create(&th, NULL, th_fn, (void*)&r)) != 0)
{
perror("pthread_create error");
}
// int *result;
// pthread_join(th, (void**)&result);
// printf("result is %d\n", (int)result);
int result;
pthread_join(th, (void*)&result);
printf("result is %d\n", result);
return 0;
}
子线程返回结果,主线程通过pthread_join获取结果。