退出线程
1,pthread_exit
2,从线程执行函数中用return;//效果等价于phread_exit
3,函数 phread_cancel 给线程发送取消请求
int pthread_cancel(pthread_t thread) 参数为要发送线程的tid 成功返回0,失败返回错误码
线程属于异常退出,无法获得退出状态信息
4,任何一个线程中调用函数exit(),或者在主线程中执行了return,会造成进程结束,使所有线程结束
线程资源回收
(1)pthread_join //需要自己回收,一般是子线程在短时间内运行完
(2)pthread_detach //可分离属性 , 子线程运行很久才结束,一般在线程创建好后设置分离状态,不关心线程退出状态
函数 pthread_detach 分离一个线程
int pthread_detach(pthread_tthread)参数tid
系统自动回收,什么时候回收不确定,取决于操作系统调度
线程 创建调度速度快,并发程度高,共享进程的数据空间,共享数据方便,但安全性低,会带来资源竞争
线程间的资源竞争:
共享资源: 临界资源
临界区 : 访问共享资源(临界资源)的代码区
机制:
互斥锁
互斥 排他性 同一时间只有一个线程访问 --- 要么不访问 要访问就是一次完整操作 (原子操作)
锁是一种线程间同步机制能有序访问
锁的操作机制
定义互斥锁 ==》初始化锁 ==》加锁 ==》解锁 ==》销毁
(1)定义互斥锁 (在全局定义)
pthread_mutex_t mutex;
互斥锁类型 互斥锁变量 内核对象
(2)初始化 (在主函数创建线程之前)
函数pthread_mutex_init();
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
参数:
@mutex //就是要初始化的 互斥锁变量
@attr //属性
//NULL 默认属性 --- 普通锁
(3)加锁 //加锁 加在 要访问临界资源的地方
pthread_mutex_lock(); //上锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
(4) 解锁
pthread_mutex_unlock(); //解锁 临界资源访问之后就解开
int pthread_mutex_unlock(pthread_mutex_t *mutex);
(5) 销毁
pthread_mutex_destroy();//销毁一把锁
int pthread_mutex_destroy(pthread_mutex_t *mutex); //用完之后锁要销毁
静态初始化 ,定义的同时并初始化 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;