1.pthread_exit
void pthread_exit(void *retval);
功能:
结束线程
参数:
retval --- 带出的值的 地址
注意:
1. pthread_exit //带出的是 保存了 退出状态值 的空间的地址
//退出状态值 不能放在栈上
2. pthread_exit //主线程调用的时候,此时不会结束进程,只是结束了主线的执行流
//这种情况,进程会在所有线程执行完之后才结束 .

prhread_exit结束线程(等待所用线程执行完)
int pthread_join(pthread_t thread, void **retval);
2.pthread_cancel
int pthread_cancel(pthread_t thread)
功能:
取消线程
参数:
thread --- 要取消的线程的tid
返回值
成功 0
失败 错误码
注意:
1. 线程间 的地位是平等的 可以 相互取消

2.在子线程中同样可以取消主线程

3.总结
线程:
【1】.线程 --- 轻量级的进程
【2】线程组成
线程tid
程序计数器
其它寄存器
栈
【3】创建线程
pthread_create
tid
属性 -- 可结合 可分离 ---决定最终资源的回收方式
线程执行函数 --- 这是体现线程任务的部分
arg -- 传给线程执行函数的参数
【4】线程退出
a.pthread_exit
b.return ---线程执行函数中
c.pthread_cancel
d.exit
【5】.线程退出状态值
pthread_join
4.线程的属性的设置:
1. pthread_detach //将指定的线程设置为分离状态 --- 那么资源的回收将自动完成

2. pthread_attr_setdetachstate
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
功能:
设置线程的属性
参数:
@attr --- 属性的对象 (变量)
@detachstate --- 要设置的属性
PTHREAD_CREATE_DETACHED //分离
PTHREAD_CREATE_JOINABLE //结合
返回值
成功 0
失败 errno
【1】.初始化 一个 属性的对象
int pthread_attr_init(pthread_attr_t *attr);
【2】设置属性信息
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
【3】销毁
int pthread_attr_destroy(pthread_attr_t *attr);

5.pthread_cleanup
void pthread_cleanup_push(void (*routine)(void *), void *arg);
功能:注册一个线程清理函数
参数,routine,线程清理函数的入口
arg,清理函数的参数。
返回值,无
void pthread_cleanup_pop(int execute);
功能:调用清理函数
execute,
非0 执行清理函数
0 ,不执行清理
返回值,无
注意:
1. 使用时 pthread_cleanup_push pthread_cleanup_pop 要一起用 ,需要在一个代码块

触发方式:
1.pthread_cleanup_pop(非零值)
2.pthread_cleanup_pop(0) //pthread_exit() //退出动作会导致 触发
pthread_exit(NULL);
pthread_cleanup_pop(0);
3.pthread_cancel(); //被其它线程结束时
6.线程 对比 进程
进程
优点
进程空间独立 --- 更稳定 安全 可靠
缺点
进程创建,调度效率低
数据共享不方便 ---- 进程间通信
线程
优点
创建,调度效率高
共享数据方便
缺点
共享进程空间和资源
---不稳定,不安全
共享数据 ---资源的竞争
7.互斥和原子性操作的概念
【1】互斥操作 :
互斥 --- 排他性
【2】原子性操作 --- 不可再分的操作
临界资源: 共享资源
临界区 : 一段代码区域(访问临界资源的那段代码)
原子操作: 要么不操作,要操作,一定是一次完整的操作。不能被打断。
概念:
互斥 ===》在多线程中对临界资源的排他性访问。
互斥机制 ===》互斥锁 ===》保证临界资源的访问控制。
8.pthread_mutex_t mutex;
互斥锁类型 互斥锁变量 内核对象
框架:
定义互斥锁 ==》初始化锁 ==》加锁 ==》解锁 ==》销毁
**** *** ***
【1】定义:
pthread_mutex_t mutex;
【2】初始化锁
int pthread_mutex_init(
pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr);
功能:将已经定义好的互斥锁初始化。
参数:mutex 要初始化的互斥锁
atrr 初始化的值,
一般是NULL表示默认锁 //一般的锁 ,读写锁
返回值:成功 0
失败 非零
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; //静态初始化
【3】加锁:
int pthread_mutex_lock(pthread_mutex_t *mutex);
功能:用指定的互斥锁开始加锁代码
加锁后的代码到解锁部分的代码属于原子操作,
在加锁期间其他进程/线程都不能操作该部分代码
如果该函数在执行的时候,mutex已经被其他部分
使用则代码阻塞。
参数: mutex 用来给代码加锁的互斥锁
返回值:成功 0
失败 非零
【4】、解锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);
功能:将指定的互斥锁解锁。
解锁之后代码不再排他访问,一般加锁解锁同时出现。
参数:用来解锁的互斥锁
返回值:成功 0
失败 非零
【5】销毁
int pthread_mutex_destroy(pthread_mutex_t *mutex);
功能:使用互斥锁完毕后需要销毁互斥锁
参数:mutex 要销毁的互斥锁
返回值:成功 0
失败 非零
注意:
原则 --- 锁的区域 尽可能小

792

被折叠的 条评论
为什么被折叠?



