现在的位置: 首页 > 综合 > 正文

linux学习值十四—线程终止pthread_exit()&pthread_join()

2017年02月05日 ⁄ 综合 ⁄ 共 1628字 ⁄ 字号 评论关闭

linux下有两种方式可以使线程终止。第一种通过return从线程函数返回,第二种通过调用函数pthread_exit()是线程退出。

pthread_exit()函数原型:
#include<pthread.h>

 void pthread_exit(void* retval);

参数retval:pthread_exit()调用线程的返回值,可以用pthread_join()函数来检索获取。

功能:退出线程。

注意:
1.线程终止最重要的问题是资源释放的问题,特别是临界资源的释放。因为临界资源在一段时间内只能被一个线程所持有,当线程要使用临界资源时需提交请求,如果该资源未被使用则申请成功,否则等待。临界资源使用完毕后要释放以便其他线程可以使用。

2.线程终止的另外一个问题是线程间的同步问题。一般情况下,进程中各个线程的运行是相互独立的,线程的终止并不会相互通知,也不会影响其他的线程,终止的线程所占用的资源不会随着线程的终止而归还系统,而是仍为线程所在的进程持有。正如进程之间可以使用wait()系统调用来等待其他进程结束一样,线程也有类似的函数:pthread_join()函数。

pthread_join()函数原型:
#include<pthread.h>

   int pthread_join(pthread_t thread, void **retval);

参数:

thread: 线程标识符,即线程ID,标识唯一线程。
retval: 用户定义的指针,用来存储被等待线程的返回值。

返回值 : 0代表成功。 失败,返回的则是错误号。

功能:以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果进程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。

注意:

1.一个可“join”的线程所占用的内存仅当有线程对其执行立pthread_join()后才会释放,因此为了避免内存泄漏,所有线程的终止时,要么已被设为DETACHED,要么使用pthread_join()来回收资源。

2.一个线程不能被多个线程等待,否则第一个接受到信号的线程成功返回,其余调用pthread_join()的线程返回错误代码ESRCH。

示例代码:

#include<stdio.h>
#include<pthread.h>

void assisthread(void*arg)
{
   printf("I am helping to do some jods\n");
   sleep(3);
   printf("pthreadID:%u\n",pthread_self());
   pthread_exit(0);
}

int main()
{
   pthread_t assistthid;
   int status;
   printf("main pthreadID:%u\n",pthread_self());
   pthread_create(&assistthid,NULL,(void*)assisthread,NULL);
   printf("create pthreadID:%u\n",assistthid);
   pthread_join(assistthid,(void*)&status);//等待线程assisthread结束
   printf("assistthid's exit is caused %d\n",status);
   
   return 0;
}

运行结果:

pc@ubuntu:~/linux_lan/thread$ ./jointhread
main pthreadID:1164756800
create pthreadID:1156445952
I am helping to do some jods
pthreadID:1156445952
assistthid's exit is caused 0

分析:

pthread_join()函数会阻塞主线程,等待assisthread结束,pthread_exit()退出码是0,则返回给status的值为0;

抱歉!评论已关闭.