先决条件–
操作系统中的信号灯
,
进程间通讯
生产者消费者问题是经典的同步问题。我们可以通过使用信号量来解决这个问题。
一种
信号
S是一个整数变量, 只能通过两个标准操作来访问:wait()和signal()。
wait()操作将信号量的值减少1, 而signal()操作将其值的值增加1。
wait(S){while(S<
=0);
// busy waitingS--;
}signal(S){S++;
}
信号量有两种类型:
- 二进制信号量–这类似于互斥锁, 但不相同。它只能有两个值– 0和1。它的值初始化为1。它用于通过多个过程来解决临界区问题。
- 计数信号量–其值的范围可以是不受限制的域。它用于控制对具有多个实例的资源的访问。
为了解决这个问题, 我们需要两个计数信号量– Full和Empty。在任何给定时间, "满"将跟踪缓冲区中的项目数, 而"空"将跟踪未占用的插槽数。
信号量的初始化–
【线程(使用信号量的生产者消费者问题套装1)】互斥锁= 1
Full = 0 //最初, 所有插槽均为空。因此, 完整插槽为0
空= n //所有插槽最初都是空的
生产者解决方案–
do{//produce an itemwait(empty);
wait(mutex);
//place in buffersignal(mutex);
signal(full);
}while(true)
当生产者生产一个项目时, "空"的值将减少1, 因为现在将填充一个插槽。互斥锁的值也减小了, 以防止使用者访问缓冲区。现在, 生产者已经放置了该项目, 因此" full"的值增加了1。由于生产者的任务已经完成并且消费者可以访问缓冲区, 因此互斥量的值也增加了1。
消费者解决方案–
do{wait(full);
wait(mutex);
// remove item from buffersignal(mutex);
signal(empty);
// consumes item}while(true)
当消费者从缓冲区中删除项目时, " full"的值将减少1, 并且互斥量的值也将减少, 以使生产者此时无法访问缓冲区。现在, 消费者已经消费了该商品, 因此将"空"的值增加了1。互斥量的值也增加了, 以便生产者现在可以访问缓冲区。
参见实施–Java中使用信号量的生产者-消费者解决方案|套装2
推荐阅读
- AngularJS 动画制作详细实现代码
- 什么是本地主机(localhost)()
- PHP | chmod()函数文件权限用法详解
- Java中的默认数组值用法详解
- 解决问题(Module build failed ReferenceError [BABEL] main.js Unknown option react.js.Children)
- 精品资源!BAT大牛亲授 基于ElasticSearch的搜房网实战百度网盘下载
- Windows Office专业版2016双击激活工具下载和完全安装教程
- 如何实现优先队列(Java使用数组实现最小堆和优先队列)
- wordpress个人博客主题BuddyPress最新中文版在线社区系统社交网站免费下载