Linux线程安全之----生产者消费者模型

目录

一、生产者和消费者模型:

1.1、123规则:

1.2、应用场景:

1.3、优点:

二、代码实现


一、生产者和消费者模型:

1.1、123规则:

  • 1.个线程安全的队列:只要保证先进先出的特性的数据结构就都可以称为队列
  • 这个队列要保证互斥(就是保证当前只有一个线程可以对他进行操作,其他线程不可以同时来操作)还要保证同步当生产者将队列中填充满了之后要通知消费者来进行消费,消费者消费之后通知生产者来生产
  • 2.中角色的线程:生产者和消费者(生产者往队列中生产,消费者从队列中拿内容消费)
  • 3.个规则:生产者和生产者互斥,消费者和消费者互斥,生产者和消费者互斥+同步。

1.2、应用场景:

比如说微信的后台程序:在不同的场景下一个进程可以是消费者也可以是生产者

1.3、优点:

1.忙闲不均:在一时刻可能接收消息的线程不忙而处理消息的线程一直处于工作状态

2.生产者与消费者解耦:生产者和消费者不是串型的执行(串行的处理就是当一个进程接收到消息后才可以处理消息,然后处理完之后才可以发送消息,是一个串行的过程),而我们这里将消费者和生产者解耦,接收消息的一辈子就做接收消息的事情,而处理消息的只做处理消息的事情,发送消息的只做发送的事情,不受其他进程的影响。                                                                                                  
3.支持高并发:当同一时刻多个人发送消息时这种情况是支持的,因为接收消息的线程只需要接收消息也不用感其他的事情,所以接收的速度很快。

二、代码实现

首先要有能够实现线程安全的队列,这个队列要保证同步和互斥

 

 在来一个模拟生产者和消费者的两个线程

 这时候我们来运行下代码

 我们发现这时候存在有连着输出product  两次的情况,是我们的代码有问题吗?

我们来分析一下:

本质上就是push和printf这两个操作不是原子性的,为了让代码更可观,我们可以在push中就直接实现printf这个操作

我们修改下代码再来试试看

我们这时候发现代码就很标准的生产一个,消费一个,所以我们就成功了!

猜你喜欢

转载自blog.csdn.net/flyingcloud6/article/details/128226731