线程控制(二)
来源:互联网 发布:淘宝几双销量上首页 编辑:程序博客网 时间: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: 删除一个键
- 线程(二)线程控制
- 线程控制之二
- 线程控制:Scheduler (二)
- 线程控制(二)
- 线程控制(二)
- 线程控制(二)
- RxJava二线程控制
- 线程控制(二)
- 线程(二)--线程控制-后台线程
- 多线程入门教程二:线程控制
- 线程condition(二)控制线程通知
- 深入浅出Win32多线程程序设计(二):线程控制
- RXJava——线程控制:Scheduler (二)
- Linux系统编程--线程控制(二)
- 【java】多线程控制(二)- - -线程池
- android RXJava2.0(二)--线程控制
- java SE 线程(二) 线程的控制
- 线程相关(二)——线程控制
- jQuery全屏滚动插件fullPage.js
- Spring探究(2)——Bean和AOP
- Codevs 1743 反转卡片 [Splay]
- Android自学笔记(二)基于Socket实现Android与PC通信
- WebStorm for Mac 2016.2 Wen 前端开发神器
- 线程控制(二)
- 本地存取 NSUserDefaults ios
- 答复
- POJ 3083 C - Children of the Candy Corn
- android学习资源大整合
- intellij idea 2016破解方法
- Android OkHttp完全解析
- 单片机 最小系统原理图
- 笔记︱范数正则化L0、L1、L2-岭回归&Lasso回归(稀疏与特征工程)