需要线程等待的原因:
1.已经退出的线程,其空间没有被释放,仍然在进程的地址空间内。
2.创建新的线程不会复用刚才退出线程的地址空间。
pthread_join函数:
函数原型:int pthread_join(pthread_t thread,void **value_ptr);
功能:等待线程结束。
参数:thread,线程ID。
返回值:成功返回0;失败返回错误码。
调用该函数的线程将挂起等待,直到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参数。
代码实例:
#include
#include
#include
#include
#include
void *thread1(void *arg){
printf("thread 1 returning ... \n");
int *p = (int *)malloc(sizeof(int));
*p = 1;
return (void*)p;
}
void *thread2(void *arg){
printf("thread 2 exiting ... \n");
int *p = (int *)malloc(sizeof(int));
*p = 2;
pthread_exit((void*)p);
}
void *thread3(void *arg){
while(1){
printf("thread 3 is running ...\n");
sleep(1);
}
return;
}
int main(){
pthread_t tid;
void *ret;
pthread_create(&tid,NULL,thread1,NULL);
pthread_join(tid,&ret);
printf("thread return,thread id %X,return code:%d\n",tid,*(int*)ret);
free(ret);
pthread_create(&tid,NULL,thread2,NULL);
pthread_join(tid,&ret);
printf("thread return,thread id %X,return code:%d\n",tid,*(int*)ret);
free(ret);
pthread_create(&tid,NULL,thread3,NULL);
sleep(3);
pthread_cancel(tid);
pthread_join(tid,&ret);
if(ret == PTHREAD_CANCELED)
printf("thread return,thread id %X,return code:PTHREAD_CANCELED\n",tid);
else
printf("thread return,thread id %X,return code:NULL\n",tid);
}
结果演示:
默认情况下,新创建的线程是joinable(可结合)的,线程退出后,需要对其进行pthread_join操作,否则无法释放资源,从而造成系统的内存泄漏。
如果不关心线程的返回值,join就是一种负担。这个时候,我们可以告诉系统,当线程退出时,自动释放线程资源,可以应用pthread_detach函数。
函数原型:int pthread_detach(pthread_t thread);
可以是线程组内其他线程对目标线程进行分离,也可以是线程自己分离:pthread_detach(pthread_self());
joinable和分离是冲突的,一个线程不能既是joinable又是分离的。
注意:一个分离的线程出现异常,这个线程所在的进程也会异常退出。因为不管线程分离与否,线程始终运行在进程的地址空间中。
代码实例:
#include
#include
#include
#include
#include
void *thread_run(void *arg){
pthread_detach(pthread_self());
printf("%s\n",(char*)arg);
return;
}
int main(){
pthread_t tid;
if(pthread_create(&tid,NULL,thread_run,"thread1 run...") != 0){
printf("create thread error\n");
return 1;
}
int ret = 0;
sleep(1);
if(pthread_join(tid,NULL) == 0){
printf("pthread wait success\n");
ret = 0;
}
else{
printf("pthread wait failed\n");
ret = 1;
}
return ret;
}
结果演示: