void pthread_exit(void* retval);
参数retval:pthread_exit()调用线程的返回值,可以用pthread_join()函数来检索获取。功能:退出线程。
注意:2.线程终止的另外一个问题是线程间的同步问题。一般情况下,进程中各个线程的运行是相互独立的,线程的终止并不会相互通知,也不会影响其他的线程,终止的线程所占用的资源不会随着线程的终止而归还系统,而是仍为线程所在的进程持有。正如进程之间可以使用wait()系统调用来等待其他进程结束一样,线程也有类似的函数:pthread_join()函数。
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;