线程终止
*linux中有两种方式使线程终止
>1.通过return从线程函数返回
>2.通过调用函数pthread_exit()使线程退出
pthread_exit在头文件pthread.h中声明,函数原型为:
#include<pthread.h>
void pthread_exit(void *retval)
*注意:
>1.在主线程中,如果从main函数返回或调用了exit函数退出主线程,则整个进程终止.此时进程中所有线程也将终止,因此在主线程不能过早的从main函数返回.
>2.如果主线程调用pthread_exit函数,则仅仅是主线程消亡,进程不会结束,进程内的线程也不会终止,直到所有线程结束,进程才会结束.
资源释放
*特别是临界资源,临界资源在一段时间内只能被一个线程所持有,当线程要使用临界资源时需提出请求,如果该资源未被使用则申请成功,否则等待.临界资源使用完毕后要释放以便其他线程可以使用.
*临界资源为一个线程所独占,当一个线程终止时,如果不释放其占有的临界资源,则该资源会被认为还被已经退出的线程所使用,因而永远不会得到释放.如果一个线程在等待使用这个临界资源,它就可能无限的等待下去,这就形成了死锁.往往是灾难性的.
自动释放资源
>pthread_cleanup_push()
>pthread_cleanup_pop()
*注意:pthread_cleanup_push()带有一个’{‘,
pthread_cleanup_pop()带有一个’}’,
所以这两个函数必须成对出现,且必须位于程序的统一代码段中才能通过编译.
*终止的线程所占用的资源不会随着线程的终止而归还系统,而是仍为线程所在的进程持有.
等待进程结束
pthread_join()
*注意:
一个线程仅允许一个线程使用pthread_join()等待它的终止,并且被等待的线程应该处于可join状态.即非DETACHED状态.处于DETACHED状态的线程无法由pthread_join()同步.
*一个可"join"的线程所占用的内存仅当有线程对其执行了pthread_join()后才会释放,为了避免内存泄漏,所有的线程终止时,要么已被设为DETACHED,要么使用pthread_join()来回收资源.
*一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join()的线程返回错误代码ESRCH.
*等待线程结束:
//等待线程结束
#include<stdio.h>
#include<pthread.h>
#include<unistd.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("assisthread's exit is caused %d\n",status);
return 0;
}
私有数据
*在线程内部,线程私有数据可以被各个函数访问,但它对其他线程是屏蔽的.
*线程私有数据采用了一键多值的技术,即一个键对应多个数值.访问数据时都是通过键值来访问,好像是对一个变量进行访问,其实是在访问不同的数据.
操作线程私有数据的函数
>pthread_key_create: 创建一个键
>pthread_setspecific: 为一个键设置线程私有数据
>pthread_getspecific: 从一个键读取线程私有数据
>pthread_key_delete: 删除一个键