Linux----生产者与消费者

生产者与消费者

  • 模型场景
    • 分析:
    • 编程流程:
      • 生产者同步流程
      • 消费者同步流程
  • 代码实现
    • 主函数
    • 生产者线程函数
    • 消费者线程函数

模型场景

Linux----生产者与消费者_第1张图片

分析:

缓冲区buff中存放数据
生产者和消费者数目不固定,生产者向缓冲区写入数据,一次写入一个整形,消费者从缓冲区读数据,一次读一个并打印。

生产者写数据时生产者就不可以读取,反之亦然。因此需要互斥锁
多个生产者不可以同时写数据,多个消费者也不可以同时读数据。所以也需要互斥锁
生产者有空间才可以写,没有空间就不能写;消费者有数据才可以读,没有数据就不可以读。所有使用一个信号量不能完成

编程流程:

生产者同步流程

需要循环向buff写入数据:
1.P(sem_empty);判是否可以进行P操作,若可以代表缓冲区有空闲空间,此时空闲空间减一

必须先P操作后加锁:若没有剩余空间就不用加锁了

2.lock():给缓冲区加锁,加锁成功就向缓冲区写数据
3.buff[i] = n :向buff中写数据
4.unlock():写完数据,给缓冲区解锁
5.V(sem_full);生产者写完数据,有数据的空间就加一

消费者同步流程

需要循环从buff读数据:
1.P(sem_full);判是否可以进行P操作,若可以代表缓冲区有数据,此时数据数量减一
2.lock():给缓冲区加锁,加锁成功就从缓冲区读数据
3.printf(buff[i] ) :从buff中读数据并打印
4.unlock():读完数据,给缓冲区解锁
5.V(sem_empty);消费者读完数据,意味着缓冲区空的数目就增加一

代码实现

主函数

Linux----生产者与消费者_第2张图片

生产者线程函数

Linux----生产者与消费者_第3张图片

消费者线程函数

Linux----生产者与消费者_第4张图片

你可能感兴趣的:(Linux操作系统,linux,运维)