#include <stdio.h>
#include <process.h>
#include <Windows.h>
//信号量与关键段
CRITICAL_SECTION g_cs;
HANDLE Empty,Full; const int BUFFER_SIZE=;//10个缓冲池
const int numofp=;//生产者线程数
const int numofc=;//消费者线程数
const int numofpr=;//要生产的产品数
int buffer[BUFFER_SIZE];
int pf=,pe=;
int count=;
int count_c=;
int mp=; //生产者
unsigned int __stdcall Producer(PVOID p){ while(true){
//等待有空的缓冲区出现
WaitForSingleObject(Empty, INFINITE);
//互斥的访问缓冲区
EnterCriticalSection(&g_cs);
if(count>numofpr){
LeaveCriticalSection(&g_cs);
ReleaseSemaphore(Full,,NULL);
break;
}
buffer[pe]=++mp;
//printf("%d,",*((int *)p));
printf("编号为%d的生产者从第%d个空缓冲池中写入数据%d\n",*((int *)p),pe,buffer[pe]);
pe=(pe+)%BUFFER_SIZE;
count++;
LeaveCriticalSection(&g_cs);
//通知消费者有新数据了
ReleaseSemaphore(Full,,NULL);
}
return ;
}
//消费者
unsigned int __stdcall Consumer(PVOID p){ while(true){
WaitForSingleObject(Full,INFINITE);
EnterCriticalSection(&g_cs);
if(count_c>numofpr){
LeaveCriticalSection(&g_cs);
ReleaseSemaphore(Empty,,NULL);
break;
}
//printf("%d,",*((int *)p));
printf(" 编号为%d的消费者从第%d个FULL缓冲区中取出数据%d\n",*((int *)p),pf,buffer[pf]);
pf=(pf+)%BUFFER_SIZE;
count_c++;
LeaveCriticalSection(&g_cs);
ReleaseSemaphore(Empty,,NULL);
}
return ;
} int main(){
printf(" 生产者消费者问题:%d生产者-%d消费者-%d缓冲区-%d个产品\n\n",numofp,numofc,BUFFER_SIZE,numofpr);
InitializeCriticalSection(&g_cs);//初始化一个临界区对象
//初始化信号量,一个记录有产品的缓冲区个数,另一个记录空缓冲区个数.
Empty=CreateSemaphore(NULL,,,NULL);
Full=CreateSemaphore(NULL,,,NULL);
const int THREADNUM=numofc+numofp;//线程数
HANDLE hThread[THREADNUM];
//生产者线程
int a=,b=,c=,d=;
hThread[]=(HANDLE)_beginthreadex(
NULL,//安全属性,NULL为默认安全属性
,//指定线程堆栈的大小,一般为0
Producer,//指定线程函数的地址
&a,//传递给线程的参数的指针
,//线程初始状态,0:立即运行
NULL);//用于记录线程ID的地址 hThread[]=(HANDLE)_beginthreadex(NULL,,Producer,&b,,NULL); hThread[]=(HANDLE)_beginthreadex(NULL,,Consumer,&c,,NULL); hThread[]=(HANDLE)_beginthreadex(NULL,,Consumer,&d,,NULL);
WaitForMultipleObjects(THREADNUM, hThread, TRUE, INFINITE);
for (int i = ; i < THREADNUM; i++)
CloseHandle(hThread[i]); //销毁信号量和关键段
CloseHandle(Empty);
CloseHandle(Full);
DeleteCriticalSection(&g_cs);
system("pause"); return ;
}

生产者消费者问题c语言实现的更多相关文章

  1. go语言实现生产者-消费者

    前言: 之前在学习操作系统的时候,就知道生产者-消费者,但是概念是模模糊糊的,好像是一直没搞明白. 其实很简单嘛,生产者生产,消费者进行消费,就是如此简单.了解了一下go语言的goroute,感觉实现 ...

  2. Go语言协程并发---生产者消费者实例

    package main import ( "fmt" "strconv" "time" ) /* 改进生产者消费者模型 ·生产者每秒生产一 ...

  3. LabVIEW之生产者/消费者模式--队列操作 彭会锋

    LabVIEW之生产者/消费者模式--队列操作 彭会锋 本文章主要是对学习LabVIEW之生产者/消费者模式的学习笔记,其中涉及到同步控制技术-队列.事件.状态机.生产者-消费者模式,这几种技术在在本 ...

  4. java 生产者消费者问题 并发问题的解决

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  5. 通过生产者消费者模式例子讲解Java基类方法wait、notify、notifyAll

    wait(),notify()和notifyAll()都是Java基类java.lang.Object的方法. 通俗解释wait():在当前线程等待其它线程唤醒.notify(): 唤醒一个线程正在等 ...

  6. 生产者/消费者问题的多种Java实现方式--转

    实质上,很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式,而这是恰恰是在本科操作系统课堂上老师反复讲解,而我们却视而不见不以为然的.在博文<一种面向作业流(工作流)的轻量级可复用 ...

  7. Java实现生产者消费者问题与读者写者问题

    摘要: Java实现生产者消费者问题与读者写者问题 1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从 ...

  8. java 生产者消费者问题 并发问题的解决(转)

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  9. (转)生产者/消费者问题的多种Java实现方式 (待整理)

    实质上,很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式,而这是恰恰是在本科操作系统课堂上老师反复讲解,而我们却视而不见不以为然的.在博文<一种面向作业流(工作流)的轻量级可复用 ...

随机推荐

  1. fastica matlab 转载

    FastICA工具箱1 http://chunqiu.blog.ustc.edu.cn/?p=68#comment-3512 FastICA代码网址如下:http://research.ics.aal ...

  2. Genymotion中文手册

    目录1.概述 22.特点 22.1最擅长于虚拟Android 22.2高可控性 22.3管理你的设备 22.4从Eclipse中开启虚拟设备 33.要求 33.1操作系统要求 33.2系统硬件要求 3 ...

  3. 注入限制绕过<转>

    突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“'”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以 ...

  4. JS保留两位小数 四舍五入函数

    js 四舍五入函数 toFixed(),里面的参数 就是保留小数的位数. <script language="javascript"> document.write(& ...

  5. c# 调用 c++写的DLL

    http://www.cnblogs.com/MarsPanda/archive/2012/09/03/2668522.html 解决办法 安装 vcredist 运行库 或者用VC6.0编写DLL ...

  6. iOS开发——MVC详解&Swift+OC

    MVC 设计模式 这两天认真研究了一下MVC设计模式,在iOS开发中这个算是重点中的重点了,如果对MVC模式不理解或者说不会用,那么你iOS肯定学不好,或者写不出好的东西,当然本人目前也在学习中,不过 ...

  7. iOS开发——面试笔试精华(三)

    面试笔试精华(三) 1.        When to use NSMutableArray and when to use NSArray? 什么时候使用NSMutableArray,什么时候使用N ...

  8. 一个响应式数据库框架SQLBrite,完美解决数据库和UI的同步更新!

    相信小伙伴们在开发中或多或少都可能遇到过这样的问题:打开一个应用后,为了快速响应,先将数据库中的数据呈现给用户,然后再去网络上请求数据,请求成功之后将数据缓存至数据库,同时更新UI,但是我们经常会这样 ...

  9. MySQL创建/删除/清空表,添加/删除字段

    创建表: create table tablename (column_name column_type); create table table_name( id int not null auto ...

  10. UNIX V6内核源码剖析——unix v6 全貌

    1. UNIX V6 运行硬件环境——PDP-11/40 PDP-11/40指令和数据都是以16比特为单位.对它而言,一个字的宽度为16比特. PDP-11/40以及周边设备的寄存器被映射到内存最高位 ...