线程同步之生产者-消费者问题
生产者-消费者问题(The Producer-Consumer Problem)是并发处理中最常见的一类同步抽象描述。先考虑但缓冲区的情况:有一个生产者进程P和一个消费者进程C公用一个缓冲区,P生产产品放入缓冲区,C从缓冲区取产品来消费。
同步问题:P进程不能往“满”的缓冲区中放入产品,C进程不能从“空”的缓冲区中取产品。
互斥问题:缓冲区不能同时被P和C使用。
解决方法:设置两个信号量full,empty,full表示缓冲区是否有产品,初值为0,empty表示缓冲区是否为空,初值为1.
1、解决单缓冲区生产者-消费者问题的描述如下:
struct semaphore
{
int value;
pointer_PCB quene;
}
semaphore S;
semaphore empty = 1;
semaphore full = 0;
main()
{
cobegin
producer();
consumer();
coend();
}
生产者-消费者进程描述如下:
void producer() void consumer()
{ {
while(true) while(true)
{ {
生产一个产品; P(fulll);
P(empty); 从缓冲区去产品;
送产品到缓冲区; V(empty);
V(full); 消费产品;
} }
} }
2、考虑多个缓冲区的情况:设有若干个生产者进程P1,P2,···,Pn,若干个消费者进程C1,C2,···,Cm,它们通过一个缓冲池(由k个缓冲区组成)联系起来,如图所示
设每个缓冲区存放一个“产品”,生产者进程不断的生产产品,并把它们放入到缓冲池中,消费者进程不断的从缓冲池中取出产品并消费。
同步问题:当缓冲池已经放满了产品时,生产者进程必须等待;当缓冲池已空时,消费者进程必须等待
互斥问题:互斥存在于所有进程之间,所有进程应互斥使用缓冲池这一临界资源
为了了解生产者-消费者问题,需设置若干信号量:full,empty,mutex.其中mutex是互斥信号量,用于对缓冲池这一临界资源的互斥访问;full,empty是同步信号量,分别表示缓冲池满和空的数量。
void main()
{
int full(0),empty(0),mutex(1);
int in = out = 0;
buffer[n];
cobegin
producer();
consumer();
coend
}
void producer()
{
while(true)
{
···
Producer an item in nextp;//生产一件产品
···
P(empty);
P(mutex);
buffer[in] = nextp;//向缓冲区存放一件产品
in = (in +1)%n;
V(mutex);
V(full);
}
}
void consumer()
{
while(true)
{
P(full);
P(mutex);
nextc = buffer[out];//从缓冲区取走一件产品
out = (out+1)%n;
V(mutex);
V(empty);
consumer the item nextc;//消费一件产品
}
}
线程同步之生产者-消费者问题相关推荐
- Qt之线程同步(生产者消费者模式 - QSemaphore)
简述 生产者将数据写入缓冲区,直到它到达缓冲区的末尾,此时,它将从开始位置重新启动,覆盖现有数据.消费者线程读取数据并将其写入标准错误. Semaphore(信号量) 比 mutex(互斥量)有 ...
- Qt之线程同步(生产者消费者模式 - QWaitCondition)
简述 生产者将数据写入缓冲区,直到它到达缓冲区的末尾,这时,它从开始位置重新启动,覆盖现有数据.消费者线程读取数据并将其写入标准错误. Wait condition(等待条件)比单独使用 mut ...
- 线程同步 生产者消费者 java_Java线程同步:生产者-消费者 模型(代码示例)
public class ThreadSyn { public static void main(String[] args) { new ThreadSyn(); } public ThreadSy ...
- java 生产者消费者同步_经典线程同步问题(生产者消费者)--Java实现
原创作品,转载请注明出自xelz's blog 生产者-消费者(producer-consumer)问题是一个著名的线程同步问题.它描述的是:有一群生产者线程在生产产品,并将这些产品提供给消费者线程去 ...
- 线程同步之 生产者消费者模型详解
前言 博主本来没打算讲这个比较前面的知识的(博主socket编程还有两个部分没讲,进程也才写完回收僵尸进程的三种方法,信号捕捉器也才完结),但是今天有朋友来问博主,什么是生产者消费者模型,所以博主就先 ...
- Java多线程(实现多线程、线程同步、生产者消费者)
1.实现多线程 1.1简单了解多线程[理解] 是指从软件或者硬件上实现多个线程并发执行的技术. 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能. 1.2并发和并行[理解] 并 ...
- JAVA入门基础进阶(十四)—— 实现多线程、线程同步、生产者消费者
文章目录 1.实现多线程 1.1简单了解多线程[理解] 1.2并发和并行[理解] 1.3进程和线程[理解] 1.4实现多线程方式一:继承Thread类[应用] 1.5实现多线程方式二:实现Runnab ...
- Java学习笔记18:Java_Map集合_HashMap集合_可变参数_Stream流_多线程_线程同步_生产者消费者
文章目录 1.Map集合 1.1Map集合概述和特点[理解] 1.2Map集合的基本功能[应用] 1.3Map集合的获取功能[应用] 1.4Map集合的遍历(方式1)[应用] 1.5Map集合的遍历( ...
- 线程通信之生产者消费者阻塞队列版
线程通信之生产者消费者阻塞队列版 ProdConsumer_BlockQueueDemo.java import java.util.concurrent.ArrayBlockingQueue; im ...
最新文章
- iOS 之 IQKeyboardManager 解决使用UITableView 界面上移问题
- TestLink1.9.3测试用例:Excel转换XML工具一
- _BLOCK_TYPE_IS_VALID错误
- Android系统开机启动流程及init进程浅析
- 【Python2】Keras_ResNet 在Cifar10数据集上分类,Flask框架部署目标检测模型
- CRM呼叫中心和社交媒体集成的技术实现
- 解决方案,org.hibernate.LazyInitializationException: could not initialize proxy - no Session
- Unity Animator动画状态机 深入理解(一)
- 【论文解读】[目标检测]retinanet
- Java EE 6权威指南:第4版.基础篇
- 微信抢红包插件 android 8.0,微信抢红包插件
- 金蝶KIS专业版如何做盘点
- [4G5G专题-124]:5G培训部署篇-2-主要信令流程
- 2022年Google I/O 大会即将举行,可领取 2022 年 I/O 大会参会开发者资料徽章。
- 广州智能服务机器人展览会 | 2016人工智能展
- React Navigation——底部导航栏设计
- scrapy-splash java,小白程序员-运用Scrapy-splash爬取动态js页面
- 10个程序员必上的网站
- 发生了Post错误:错误代码40005,微信返回错误信息:invalid file type
- google财经板块股票信息查看的猜想
热门文章
- JavaScript语言中文参考手册.chm
- Web前端知识技能大汇总
- 【学习笔记】〖ASP.NET〗连接字符串的函数
- (xy)+((x^y)1)
- 领域设计基本理论知识总结(转)
- Linux Grep 命令说明
- 数据结构-排序(插入排序)
- 完美解决LINK : fatal error LNK1104: cannot open file Debug/xx.exe的问题
- 波卡链Substrate (6)SubstrateUI界面
- Hyperledger Fabric 智能合约实战 (7) windows安装fabric