有关生产者和消费者的问题

//在此声明环境变量:生产者消费者问题,只有一个个缓冲区(buffer),初始情况之下,只有一个缓冲区装有生产的物品
#include<iostream>
#include<windows.h>
using namespace std;
HANDLE buffer1;
HANDLE empty1;
HANDLE full1;
//当前商品为空
int buffer=0;
DWORD WINAPI Produce(LPVOID lpParameter);
DWORD WINAPI Comsume(LPVOID lpParameter);
int main()
{
    HANDLE hThread1;
    HANDLE hThread2;
    //有关于CreateSemaphore的参数我是不了解的,初始计数值必须为1
    //初始化是只有一个缓冲区和一件商品
 buffer1=CreateSemaphore(NULL,  //安全属性
  1,                         //初值,开始时可供使用的资源数
  1,                        //最大资源数
  NULL);                    //Semaphone名称
 empty1=CreateSemaphore(NULL,1,1,NULL);
 full1=CreateSemaphore(NULL,0,1,NULL); 
  hThread1=CreateThread(NULL,0,Produce,NULL,0,NULL);
 hThread2=CreateThread(NULL,0,Comsume,NULL,0,NULL);
 CloseHandle(hThread1);
 CloseHandle(hThread2);
 Sleep(900);
 return 0;
}
DWORD WINAPI Produce(LPVOID lpParameter)
{
 while(true)
 {
  
  WaitForSingleObject(empty1,INFINITE);//判断缓冲区是否为空,如果不为空,应该马上结束子线程的调用
  WaitForSingleObject(buffer1,INFINITE);//企图获得缓冲区的控制权进行生产,持续等待直到有信号
        cout<<"获得当前缓冲区的操作控制,进行生产"<<endl;
  buffer++;
  cout<<"当前的消费品个数为"<<buffer<<endl;
  
  ReleaseSemaphore(buffer1,1,NULL);
  ReleaseSemaphore(full1,1,NULL);
  
 }
  return 0;
}
DWORD WINAPI Comsume(LPVOID lpParameter)
{
 while(true)
 {
  WaitForSingleObject(full1,INFINITE);
  WaitForSingleObject(buffer1,INFINITE);//一直等待直到信号量有效,请求缓冲区的控制权
  
  cout<<"获取当前缓冲区的操作控制,进行消费"<<endl;
  buffer--;
  cout<<"当前消费品的个数"<<buffer<<endl;
  
  ReleaseSemaphore(buffer1,//
   1,
   NULL);//
  ReleaseSemaphore(empty1,
   1,//信号量的当前资源数增加数量,与当前缓冲区的消费有关
   NULL);
  
 }
 return 0;
}
/*从今天添加的全局变量来控制程序的执行,就可以看到自己对于信号量的不够深入了解。
信号量的请求次序是非常重要的,其实判断缓冲区是否已有物品已经在信号量中实现了
以下是有关信号量的特点和用途几句话:
1如果当前资源的数量大于0,则信号量有效
2如果当前资源数量是0,则信号量无效
3系统决不允许当前资源的数量为负值
当前资源数量绝对不能大于最大资源数量
*/

int buffer=2;//当前商品为2/
/有关于CreateSemaphore的参数我是不了解的,初始计数值必须为1
 buffer1=CreateSemaphore(NULL,1,1,NULL);
empty1=CreateSemaphore(NULL,2,1,NULL);//2代表的是缓冲区里面有两件商品
ull1=CreateSemaphore(NULL,1,1,NULL);//1代表的是缓冲区里面还可以继续生产
int buffer=2;//当前商品为2
因此我们需要非常注意缓冲区的消费品和信号量

时间: 2024-08-27 11:42:04

有关生产者和消费者的问题的相关文章

多线程操作实例——生产者与消费者

面对多线程学习生产者与消费者是最基本的实例 对于java后端开发的人员必须要掌握,还有考研考试计算机操作系统的同鞋. 下面是三个实例对于生产者与消费者的的例子,层层递进,逐步解决问题. 问题:生产者——设置信息名字name,和内容content 消费者——负责取出设置的信息. 一.基本实现 由于线程的不确定性可能出现以下问题: (1)消费者取出的信息不匹配,即不是由同一个生产者设置的信息 (2)生产者生产了多个信息,消费者才开始取出信息,或消费者取出的重复的信息. 上面的问题下面会逐一解决,下面

同步函数 生产者和消费者模式 加强版(多人生产和多人消费)

曾经搞了半天, 生产者和消费者模式  加强版(多人生产 多人消费 ).. 以前的代码格式就不再吐槽了(以后努力改进) //输出结果是一个无限循环 import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 多个生产者&多个消费者模式 * 多个生产者不断生产,多个消费者不停的消费

Parallel Programming-实现并行操作的流水线(生产者、消费者)

本文介绍如何使用C#实现并行执行的流水线(生产者消费者): 流水线示意图 实现并行流水线 一.流水线示意图 上图演示了流水线,action1接收input,然后产生结果保存在buffer1中,action2读取buffer1中由action1产生的数据,以此类推指导action4完成产生Output. 以上也是典型的生产者消费者模式. 上面的模式如果使用普通常规的串行执行是很简单的,按部就班按照流程图一步一步执行即可.如果为了提高效率,想使用并行执行,也就是说生产者和消费者同时并行执行,该怎么办

java多线程(同步与死锁问题,生产者与消费者问题)

首先我们来看同步与死锁问题: 所谓死锁,就是A拥有banana,B拥有apple. A对B说:你把apple给我,我就把banana给你. B对A说:你把banana给我,我就把apple给你. 但是A和B都在等待对方的答复,那么这样最终的结果就是A得不到apple,B也得不到banana.这种死循环就是死锁. 于是我们可以模拟上面的描述,写出以下代码: 类A代表A这个人, public class A { public void say(){ System.out.println("A sai

生产者与消费者问题

***********************************************声明****************************************************** 原创作品,出自 "晓风残月xj" 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj). 由于各种原因,可能存在诸多不足,欢迎斧正! *******************************************

使用JUC并发工具包的Lock和Condition,实现生产者和消费者问题中的有界缓存

JDK5.0之前,用java实现生产者和消费者的唯一方式就是使用synchronized内置锁和wait/notify条件通知机制.JDK5.0之后提供了显示锁Lock和条件队列Condition,与内置锁和内置条件队列相对应,但是显示的锁和条件队列,功能更强大,更灵活.此外JDK5.0之后还提供了大量很有用的并发工具类,如BlockingQueue等,基于这些数据结构,能够方便.快速.高效的构建自己应用需要的效果.这里我们简单使用下显示锁和条件队列,来模拟有界缓存的实现,功能类似于JDK内置的

Java中的生产者、消费者问题

Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库). 其中一个是生产者, 用于将产品放入仓库: 另外一个是消费者, 用于从仓库中取出产品消费. 问题出现在当仓库已经满了, 而此时生产者还想向其中放入一个新的产品的情形, 其解决方法是让生产者此时进行等待, 等待消费者从仓库中取走了一个或者多个产品后再去唤醒它. 同样地, 当仓库已经空了, 而消费者还

java 22 - 16 多线程之生产者和消费者的问题

生产者和消费者问题的描述图 通过上图,我们可以发现: 生产者和消费者使用的都是同一个资源(肉包子) 所以,当使用线程的时候,这两类的锁也是同一把锁(为了避免出现线程安全问题) 例子:学生信息的录入和获取 * 资源类:Student * 设置学生数据:SetThread(生产者) * 获取学生数据:GetThread(消费者) * 测试类:StudentDemo * 资源类:Student 1 public class Student { 2 3 String name; 4 int age; 5

实验四、生产者和消费者

一.    实验目的 1.掌握临界区的概念及临界区的设计原则: 2.掌握信号量的概念.PV操作的含义以及应用PV操作实现进程的同步与互斥: 3.分析进程争用资源的现象,学习解决进程互斥的方法. 二.    实验内容及要求 分析进程的同步与互斥现象,编程实现经典的进程同步问题——生产者消费者问题的模拟 生产者--消费者问题表述: 有一环形缓冲池,包含n个缓冲区(0~n-1). 有两类进程:一组生产者进程和一组消费者进程,生产者进程向空的缓冲区中放产品,消费者进程从满的缓冲区中取走产品,所有进程必须

多线程生产者、消费者模式中,如何停止消费者?多生产者情况下对“毒丸”策略的应用。

生产者.消费者模式是多线程中的经典问题.通过中间的缓冲队列,使得生产者和消费者的速度可以相互调节. 对于比较常见的单生产者.多消费者的情况,主要有以下两种策略: 通过volatile boolean producerDone =false 来标示是否完成.生产者结束后标示为true, 消费者轮询这个变量来决定自己是否退出. 这种方式对producerDone产生比较大的争用,实现起来也有诸多问题需要考虑. 比较经典的"毒丸"策略,生产者结束后,把一个特别的对象:"毒丸&quo