线程终止有2种情况,第一种是线程函数执行完毕、从线程函数返回(通过return语句),第二种是通过调用函数pthread_exit()使线程退出。
需要注意的是:
- 在主线程中,如果从main函数返回或是调用了exit函数退出主线程,则整个进程将终止,显而易见进程中的所有线程也将终止,因此主线程不能过早从main函数返回。
- 如果主线程调用了pthread_exit函数,则仅仅是主线程消亡,进程不会结束,进程内的线程也不会终止,直到所有线程结束,进程才会结束。
- 线程终止最重要的问题是资源释放,尤其是临界资源,为一个线程独占,所以使用完毕要及时释放以便其他线程可以使用。
- 线程的运行时互相独立的,线程的终止并不会互相通知,也不会影响其他线程。终止的线程占用的资源不会随着线程的终止而归还系统,仍为线程所在的进程所持有。
- 类似于进程中使用的wait函数,函数pthread_join用来等待一个线程的结束。其调用者将被挂起并等待子线程终止。
- 一个线程仅仅允许一个线程使用pthread_join()等待它的终止,并且被等待的线程应该处于可join状态,即非DETACHED状态。(DETACHED状态时指对某个线程执行pthread_detach()后所处的状态。处于此状态的线程无法由pthread_join()同步。)
- 一个可“join”的线程所占用的内存仅当有线程对其执行了pthread_join()后才会释放,因此为了避免内存泄漏,所有线程终止时,要么已被设为DETACHED,要么使用pthread_join()来回收资源。
线程终止的实例:
#include <stdio.h>
#include <pthread.h>
void assisthread(void * arg)
{
printf ("I am helping to do some jobs\n");
sleep (3);
pthread_exit (0);
}
int main(void)
{
pthread_t assistthid;
int status;
pthread_create (&assistthid, NULL, (void *) assisthread, NULL);
pthread_join(assistthid, (void *) &status);
printf("assistthread's exit is caused %d\n", status);
return 0;
}
运行结果:
从执行情况看,“I am helping to do some jobs.”这行字打印出3秒之后,才会继续打印主线程中的“assistthread's exit caused 0”这行字,这说明语句pthread_join的确让主线程阻塞了,并且等待子线程执行完毕返回之后再继续往下执行。pthread_exit结束时的退出码是0,pthread_join得出的也为0,两者是一致的。