Linux线程:线程同步与生产消费者模型

目录

一、线程同步的含义及相关接口

1.1条件变量

1.2同步概念与竞态条件

1.4条件变量相关接口

二、生产消费者模型

2.1为何要使用生产者消费者模型

2.2 生产者消费者模型优点

2.3 基于BlockingQueue的生产者消费者模型

2.4生产消费者模型的321


一、线程同步的含义及相关接口

1.1条件变量

当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。
例如一个线程访问队列时,发现队列为空,它只能等待,只到其它线程将一个节点添加到队列中。这种情况就需要用到条件变量。

1.2同步概念与竞态条件

同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题,叫做同步。
竞态条件:因为时序问题,而导致程序异常,我们称之为竞态条件。在线程场景下,这种问题也不难理解。

1.4条件变量相关接口

定义条件变量:

pthread_cond_t cond=PTHREAD_COND_INITIALIZER;定义一个全局条件变量

初始化:

int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t 
*restrictattr);
参数:
cond:要初始化的条件变量
attr:NULL

销毁:

int pthread_cond_destroy(pthread_cond_t *cond)

等待条件满足:

int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t 
*restrict mutex);
参数:
cond:要在这个条件变量上等待
mutex:互斥量,后面详细解释

唤醒等待:

int pthread_cond_broadcast(pthread_cond_t *cond);唤醒所有cond等待的线程
int pthread_cond_signal(pthread_cond_t *cond);唤醒一个cond等待的线程
如果唤醒成功返回0,失败返回错误码

二、生产消费者模型

2.1为何要使用生产者消费者模型

生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。

2.2 生产者消费者模型优点

为什么生产消费者模型可以提供比较好的并发度:

1、解耦
2、支持并发
3、支持忙闲不均

2.3 基于BlockingQueue的生产者消费者模型

在多线程编程中阻塞队列 (Blocking Queue) 是一种常用于实现生产者和消费者模型的数据结构。其与普通的队列区别在于,当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出( 以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞)。

而此队列作为消费者和生产者所共同访问的中间资源,属于临界区资源,所以对此队列进行访问时需要持锁进行访问,这也就是在等待条件满足时为什么要将锁进行传参的原因。当持有锁并且满足条件时就可以对其进行访问。 

2.4生产消费者模型的321

3即3种关系生产者与生产者之间其关系是互斥||同步。

消费者与消费者之间其关系是互斥||同步。

生产者与消费者之间其关系是互斥&&同步。

2即2种角色生产者角色和消费者角色。

1即一个交易场所:超市。

超市就是我们所提出的共享资源即临界资源,也就是临时保存数据的内存空间或某种数据结构对象,而在生产消费者模型种相互交易的商品就是数据。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-09 17:38:01       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-09 17:38:01       5 阅读
  3. 在Django里面运行非项目文件

    2024-06-09 17:38:01       4 阅读
  4. Python语言-面向对象

    2024-06-09 17:38:01       6 阅读

热门阅读

  1. Vue3图片懒加载封装自定义指令

    2024-06-09 17:38:01       21 阅读
  2. C语言——共用体

    2024-06-09 17:38:01       19 阅读
  3. Docker:镜像命令和容器命令

    2024-06-09 17:38:01       21 阅读
  4. Spring boot SSL证书路径配置

    2024-06-09 17:38:01       18 阅读
  5. MyBatis 延迟加载,一级缓存,二级缓存设置

    2024-06-09 17:38:01       22 阅读
  6. 在 Linux 系统上安装 Android NDK

    2024-06-09 17:38:01       20 阅读
  7. Redis的哨兵机制,一文全解

    2024-06-09 17:38:01       13 阅读
  8. 07.组件间通信-provide-inject(祖孙通信)

    2024-06-09 17:38:01       23 阅读
  9. 常见知识点总结

    2024-06-09 17:38:01       18 阅读
  10. 列表的C++实

    2024-06-09 17:38:01       19 阅读
  11. JZ2440笔记:热插拔驱动

    2024-06-09 17:38:01       15 阅读