基础篇:内置锁实现生产者和消费者模型

背景

“生产者和消费者模型” 是多线程通信的典型案例,本章节将利用前一节的锁和条件队列的知识,来实现一个完整的有界缓冲区,并创建多个线程访问该有界缓冲区,模拟生产者提供数据、消费者处理数据的过程,正文如下。

生产者消费者模型

生产者和消费者模型中,因为多个线程共享同一个缓冲区,所以就涉及到两个重要的通信约束:

  1. 缓冲区满的时候,生产者不能再添加数据,应该阻塞等待,直到缓冲区有空位;
  2. 缓冲区空的时候,消费者不能再获取数据,应该阻塞等待,直到有新的数据加入缓冲区。

要保证上述约束条件,可以用 sleep 空循环,也可以使用锁和条件队列。利用锁和条件队列实现的思路是,生产者和消费者有各自要等待的条件,一旦条件不满足,就阻塞在该条件队列上,直到另一个线程唤醒自己。

实现过程

缓冲区的 “满” 和 “空” 是两个条件,如果用内置锁,对缓冲区的操作由同一把锁保护,只能共用一个条件队列;如果使用显式锁,则可以定义两个条件队列。

猜你喜欢

转载自blog.csdn.net/wojiushiwo945you/article/details/103631359
今日推荐