线程控制(二)

来源:互联网 发布:淘宝几双销量上首页 编辑:程序博客网 时间:2024/06/13 21:58

线程终止

*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:  删除一个键

0 0