线程基础(二):线程锁和条件变量(笔记)
来源:互联网 发布:优化游戏的软件哪个好 编辑:程序博客网 时间:2024/05/22 01:52
线程属性:
头文件#include<pthread.h>
互斥锁属性attr
int pthread_mutexattr_init(pthread_mutexattr_t *attr)
int pthread_mutexattr_destroy(pthread_mutexattr_t* attr)
成功返回0, 出错返回错误编号。
##互斥锁进程共享属性:
头文件include<pthread.h>
int pthread_mutexattr_getpshared(const pthread_mutexattr_t *restrict attr, int *restrict phared)//获得共享进程属性
int pthread_mutexattr_init(pthread_mutexattr_t *attr)
int pthread_mutexattr_destroy(pthread_mutexattr_t* attr)
成功返回0, 出错返回错误编号。
##互斥锁进程共享属性:
头文件include<pthread.h>
int pthread_mutexattr_getpshared(const pthread_mutexattr_t *restrict attr, int *restrict phared)//获得共享进程属性
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared)//设置共享进程属性
attr:互斥锁属性
pshared:进程共享属性
1.PTHREAD_PROCESS_PRIVATE(默认情况)
锁只能处理一个进程内的线程进行互斥
2.PTHREAD_PROCESS_SHARED
所可以用于两个不同进程的线程互斥
pshared:进程共享属性
1.PTHREAD_PROCESS_PRIVATE(默认情况)
锁只能处理一个进程内的线程进行互斥
2.PTHREAD_PROCESS_SHARED
所可以用于两个不同进程的线程互斥
##互斥锁类型
1.标准互斥锁:PTHREAD_MUTEX_NORMAL
第一次上锁成功,第二次上锁会阻塞
2.递归互斥锁:PTHREAD_MUTEX_RECURSIVE
第一次上锁成功,第二次以后上锁还是成功,内部计数
3.检错互斥锁:PTHREAD_MUTEX_ERRORCHECK
第一次上锁成功, 第二次上锁会出错(相当于标准锁的非阻塞版本)
4.默认互斥锁:PTHREAD_MUTEX_DEFAULT(等同于标准互斥锁)
1.标准互斥锁:PTHREAD_MUTEX_NORMAL
第一次上锁成功,第二次上锁会阻塞
2.递归互斥锁:PTHREAD_MUTEX_RECURSIVE
第一次上锁成功,第二次以后上锁还是成功,内部计数
3.检错互斥锁:PTHREAD_MUTEX_ERRORCHECK
第一次上锁成功, 第二次上锁会出错(相当于标准锁的非阻塞版本)
4.默认互斥锁:PTHREAD_MUTEX_DEFAULT(等同于标准互斥锁)
##线程互斥————读写锁
1.线程使用互斥锁缺乏读的并发性
2.当读操作较多,写操作较少时,可以使用读写锁提高线程读并发性
3.读写锁数据类型:pthread_rwlock_t
1.线程使用互斥锁缺乏读的并发性
2.当读操作较多,写操作较少时,可以使用读写锁提高线程读并发性
3.读写锁数据类型:pthread_rwlock_t
##线程同步---条件变量
互斥锁的缺点是他只有两种状态:锁定和非锁定
条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足
条件变量内部是一个等待队列,放置等待的线程,线程在条件变量上等待和通知,互斥锁用来保护等待队列(对等待队列上锁),条件变量通常和互斥锁一起使用。
条件变量允许线程等待特定条件发生,当条件不满足时,线程通常先进入阻塞状态,等待条件发生变化,一旦其他某个线程改变了条件,可唤醒一个或者多个线程。
具体的判断条件还得用户给出
条件变量的数据类型pthread_cond_t
互斥锁的缺点是他只有两种状态:锁定和非锁定
条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足
条件变量内部是一个等待队列,放置等待的线程,线程在条件变量上等待和通知,互斥锁用来保护等待队列(对等待队列上锁),条件变量通常和互斥锁一起使用。
条件变量允许线程等待特定条件发生,当条件不满足时,线程通常先进入阻塞状态,等待条件发生变化,一旦其他某个线程改变了条件,可唤醒一个或者多个线程。
具体的判断条件还得用户给出
条件变量的数据类型pthread_cond_t
##条件变量等待操作
示例程序:
Study_self/pthread_cal.c
头文件<pthread.h>
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex)
int pthread_cond_timewait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex,const struct timespec *restrict timeout)
返回: 成功返回0, 错误返回错误编号。
struct timespec{
time_t tv_sec; //seconds
long tv_nsec; //nanoseconds
}
示例程序:
Study_self/pthread_cal.c
头文件<pthread.h>
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex)
int pthread_cond_timewait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex,const struct timespec *restrict timeout)
返回: 成功返回0, 错误返回错误编号。
struct timespec{
time_t tv_sec; //seconds
long tv_nsec; //nanoseconds
}
参数:
cond: 条件变量
mutex: 互斥锁
互斥锁是对条件变量cond的保护
线程由于调用wait函数阻塞,否则释放互斥锁
##条件变量通知操作
int pthread_cond_signal(pthread_cond_t *cond)
//通知单个线程
int pthread_cond_broadcast(pthread_cond_t *cond)
//通知所有线程
成功返回0, 错误返回错误编号
cond: 条件变量
mutex: 互斥锁
互斥锁是对条件变量cond的保护
线程由于调用wait函数阻塞,否则释放互斥锁
##条件变量通知操作
int pthread_cond_signal(pthread_cond_t *cond)
//通知单个线程
int pthread_cond_broadcast(pthread_cond_t *cond)
//通知所有线程
成功返回0, 错误返回错误编号
参数:
cond:条件变量
当条件满足时,线程需要通知等待线程
cond:条件变量
当条件满足时,线程需要通知等待线程
lock(&mutex);-------------------------------1
pthread_cond_wait()的内部流程:
{
1.unlock(&mutex)//释放锁 --------------------------2
2.lock(&mutex)//再次上锁,保护等待队列
3.将线程自己加入到等待队列中
4.unlock(&mutex)//释放锁
5.当前等待的线程阻塞==>等待其他线程调用signal 和broadcast唤醒
6.在唤醒后,lock(&mutex)//上锁(因为有用到等待队列)-----------------------3
7.从等待队列中删除线程自己
}
unlock(&mutex)-------------------------4
//4号释放锁不是和1号相对应,而是和3号对应, 1号和2号对应
***再用到条件变量等待api的时候要特别注意锁的对应性。
pthread_cond_wait()的内部流程:
{
1.unlock(&mutex)//释放锁 --------------------------2
2.lock(&mutex)//再次上锁,保护等待队列
3.将线程自己加入到等待队列中
4.unlock(&mutex)//释放锁
5.当前等待的线程阻塞==>等待其他线程调用signal 和broadcast唤醒
6.在唤醒后,lock(&mutex)//上锁(因为有用到等待队列)-----------------------3
7.从等待队列中删除线程自己
}
unlock(&mutex)-------------------------4
//4号释放锁不是和1号相对应,而是和3号对应, 1号和2号对应
***再用到条件变量等待api的时候要特别注意锁的对应性。
阅读全文
0 0
- 线程基础(二):线程锁和条件变量(笔记)
- POSIX线程-条件变量(二)
- 线程条件变量pthread_cond_t和线程条件锁详解
- c++11线程之条件变量condition_variable(二)
- Linux多线程编程(二)线程同步之条件变量
- Linux多线程基础学习(五)线程同步-条件变量
- C++11 线程、锁和条件变量
- 线程与条件变量和锁
- 线程条件变量应用(消费者和生产着模型)
- Linux线程同步(条件变量和信号量)
- 线程基础(二)
- POSIX线程-条件变量(一)
- POSIX线程-条件变量(一)
- 线程笔记(二)
- 条件对象(条件变量)——线程学习六
- linux多线程学习笔记四---线程同步之互斥锁、读写锁和条件变量
- (四十三)线程——线程同步(互斥锁、读写锁、条件变量、信号量)
- C++封装POSIX 线程库(二)条件变量的封装
- (转)姚期智:呼之欲出的量子计算机,和它漫长的最后一英里(全文)
- Android网络编程
- 创建继承于类person的类student并重写方法
- linux—c结构体学习
- 处理输入成绩异常
- 线程基础(二):线程锁和条件变量(笔记)
- Hibernate的查询方式
- windows中AD域的部署
- 模型的评估方法
- 单行文本过长自动替换为省略号的css写法:text-overflow:ellipsis;
- Tomcat安装及配置教程
- 【线段树+DFS序】CQYZ_Vijos_P3751 树上路径动态查询
- caffe,deeplab,对Interp层的理解
- 在同一台电脑上同时安装Python2和Python3