前言
大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!
目录
一.<同步>概念&<条件变量>基本概念
- 同步: 在保证数据安全的前提下,让线程能够 按照某种 特定的顺序 访问临界资源 ,从而有效避免 饥饿问题
- 条件变量: 利用线程间共享的全局变量进行同步的一种机制 。 它允许一个或多个线程在某个条件满足时进行等待,并在条件满足时被唤醒
- 注意:条件变量本身不是锁,而是与互斥锁(Mutex)结合使用,以确保线程安全
二.<条件变量等待> 为什么一定需要 <互斥锁 >?
- 条件等待是线程间同步的一种手段,如果只有一个线程,条件不满足,一直等下去都不会满足,所以 必须要有一个线程通过某些操作,改变共享变量,使原先不满足的条件变得满足 ,并且友好的通知等待在条件变量上的线程。
- 条件不会无缘无故的突然变得满足了,必然会 牵扯到共享数据的变化 。 所以一定要用互斥锁来保护 。没有互斥锁就无法安全的获取和修改共享数据
三.<条件变量>使用规范
- 等待条件代码
pthread_mutex_lock(&mutex);
while (条件为假)
{
pthread_cond_wait(cond, mutex);
}
...代码部分
pthread_mutex_unlock(&mutex);
- 给条件发送信号代码
pthread_mutex_lock(&mutex);
...代码部分改动共享资源,条件变为真
pthread_cond_signal(cond);//给条件发送信号代码
pthread_mutex_unlock(&mutex);
四.饥饿问题展示——“直到其他线程改变前,一直处于忙等待”
1.基于【普通队列】的<生产者消费者模型>面临的<线程饥饿问题>
- 我们有这样一个场景:
- 当一个线程 互斥地 访问某个变量时,它可能发现 在其它线程 改变状态 之前,它什么也做不了。
- 例如:在下面的 生产者消费者(普通队列)模型中 , 一个线程访问 队列 时,发现队列为空,它 只能等待(忙等待) ,直到其它线程将一个节点添加到队列中
- 这种情况就需要用到条件变量


最低0.47元/天 解锁文章
10万+

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



