Linux——互斥锁、读写锁、条件变量简单认识

线程同步:协调同步,对公共区域数据按序访问,防止数据混乱,产生于时间有关的错误
锁的使用:对公共数据进行保护,所有线程【应该】在访问公共数据前先拿到锁再访问,但锁本身不具备强制性

1. 借助互斥锁管理共享数据实现同步

mutex的主要应用函数
pthread_mutex_init 初始化
pthread_mutex_destory 销毁
pthread_mutex_lock 加锁
pthread_mutex_trylock 尝试拿锁
pthread_mutex_unlock 解锁
这几个函数的返回值都是:成功返回0;失败返回错误号
pthread_mutex_t 类型,其本质是一个结构体,简单可以当成一个整数看待,该类型的变量取值只有0/1两个取值,初始值为1,加锁为0(–),解锁为1(++)

try锁与lock加锁: lock加锁失败会阻塞,等待锁释放;tyrlock加锁失败直接返回错误号,如EBUSY,不阻塞+

使用互斥锁的一般步骤:
在这里插入图片描述注意事项:尽量保证锁的粒度越小越好,即访问前加锁,访问后立即解锁

2. 读写锁

特别强调,读写锁只有一把,但是具备两种状态:
1,读模式下加锁状态(读锁)
2,写模式下加锁状态(写锁)

====》
1)当锁是写模式加锁时, 解锁前,所有对该锁加锁的线程都会被阻塞
2)当锁是读模式加锁时,解锁前,如果线程以读模式对其加锁会成功;如果线程以写模式加锁就会被阻塞
3)当锁是读模式加锁时,既有试图以写模式加锁的线程,也有试图以读模式加锁的线程时,读写锁会阻塞随后的读模式锁请求,优先满足写模式锁。读锁,写锁并行阻塞,写锁优先级高

读写锁也叫所“共享-独占锁”,当读写锁以读模式锁住时,它是以共享模式锁住的;当它以写模式锁住时,它是以独占模式锁住的
读写锁非常适合于对数据结构读的次数远大于写的情况
在这里插入图片描述

3. 死锁

1)线程试图对同一个互斥量A加锁两次,对一个锁进行反复lock
2)线程1拥有A锁,请求获得B锁;线程2拥有B锁,请求获得A锁

4. 条件变量

条件变量本身不是锁,但它也可以造成线程阻塞,通常与互斥锁配合使用,给多线程提供一个会合的场所
在这里插入图片描述

动态初始化和静态初始化
在这里插入图片描述

条件变量相关函数wait

pthread_cond_wait 阻塞等待一个条件变量
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
参数1 条件变量;参数2 互斥锁
函数作用:
1)阻塞等待条件变量,参数1
2)释放已掌握的互斥锁(解除互斥锁)相当于pthread_mutex_unlock(&mutex);
3)当唤醒时,pthread_cond_wait函数返回时,解除阻塞并重新申请获取互斥锁pthread_mutex_lock(&mutex);
1) 2)两部都是原子操作

在这里插入图片描述等待满足时解锁阻塞等待条件满足,pthread_cond_signalpthread_cond_broadcast用于通知条件是否满足,条件满足后解除阻塞并重写加锁

原创文章 119 获赞 27 访问量 5984

猜你喜欢

转载自blog.csdn.net/qq_37299596/article/details/105947970
今日推荐