Linux:生产者消费者模型

生产者消费者,是进程间通信的一个经典模型。参考过很多资料后,总结了一个“321原则”,现在我们一起来谈一谈。

“321原则”

“3”代表的是三种关系

生产者与消费者的互斥与同步关系
生产者与生产者的互斥关系
消费者与消费者的互斥关系

“2”代表两种角色

生产者:往交易场所放东西(在计算机中一般都是数据)的人
消费者:从交易场所取东西的人

“1”代表

一个交易场所,所谓交易场所就是内存中具有存储数据的一段有界缓冲区

综上,给出生产者消费者模型的描述:两个进程共享一个缓冲区,一个进程称为生产者向缓冲区中放数据,另一个称为消费者从缓冲取中取数据,当缓冲区中被放时,生产者进程就必须可进入挂起状态,直到消费者从缓冲中取走数据时,生产者才能继续向缓冲区中存放数据,同样当缓冲取中没有数据时,消费者进程就必须进入挂起休眠状态,直到生产者向缓冲区中放入数据时,消费者才能被唤醒继续从缓冲区中取走数据。

这里写图片描述

接下来,将基于两种生产者消费者模型进行讨论:
1. 基于单链表的生产者消费者模型编写。
2. 基于环形队列的生产者消费者模型编写。

基于单链表的生产者消费者模型编写

那么什么是链表呢?
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
链表又有哪些接口呢?

链表初始化
链表判空
链表头插
链表头删
链表打印
链表销毁

系统接口说明:
条件变量

int  pthread_cond_wait(pthread_cond_t* redtrist cond ,  pthread_mutex_t* redtrist )//挂起等待

1、不满足条件时必须进行休眠(释放Mutex)
2、不能抱着锁资源休眠(进行阻塞式等待)
3、能被唤醒(被唤醒时能够重新获得Mutex资源并等待)

int  pthread_cond_signal(pthread_cond_t* cond )     //唤醒

1、生产者生产好数据之后通知消费者来消费数据
2、消费者消费完数据后通知生产者前来生产

锁相关接口说明

int pthread_mutex_lock(pthread_mutex_t *mutex);

阻塞式加锁

int pthread_mutex_trylock(pthread_mutex_t *mutex);

非阻塞式加锁

int pthread_mutex_unlock(pthread_mutex_t *mutex
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值