生产者消费者问题c语言实现

 1 #include <stdio.h>
2 #include <process.h>
3 #include <Windows.h>
4 //信号量与关键段
5 CRITICAL_SECTION g_cs;
6 HANDLE Empty,Full;
7
8 const int BUFFER_SIZE=10;//10个缓冲池
9 const int numofp=2;//生产者线程数
10 const int numofc=2;//消费者线程数
11 const int numofpr=100;//要生产的产品数
12 int buffer[BUFFER_SIZE];
13 int pf=0,pe=0;
14 int count=1;
15 int count_c=1;
16 int mp=0;
17
18 //生产者
19 unsigned int __stdcall Producer(PVOID p){
20
21 while(true){
22 //等待有空的缓冲区出现
23 WaitForSingleObject(Empty, INFINITE);
24 //互斥的访问缓冲区
25 EnterCriticalSection(&g_cs);
26 if(count>numofpr){
27 LeaveCriticalSection(&g_cs);
28 ReleaseSemaphore(Full,1,NULL);
29 break;
30 }
31 buffer[pe]=++mp;
32 //printf("%d,",*((int *)p));
33 printf("编号为%d的生产者从第%d个空缓冲池中写入数据%d\n",*((int *)p),pe,buffer[pe]);
34 pe=(pe+1)%BUFFER_SIZE;
35 count++;
36 LeaveCriticalSection(&g_cs);
37 //通知消费者有新数据了
38 ReleaseSemaphore(Full,1,NULL);
39 }
40 return 0;
41 }
42 //消费者
43 unsigned int __stdcall Consumer(PVOID p){
44
45 while(true){
46 WaitForSingleObject(Full,INFINITE);
47 EnterCriticalSection(&g_cs);
48 if(count_c>numofpr){
49 LeaveCriticalSection(&g_cs);
50 ReleaseSemaphore(Empty,1,NULL);
51 break;
52 }
53 //printf("%d,",*((int *)p));
54 printf(" 编号为%d的消费者从第%d个FULL缓冲区中取出数据%d\n",*((int *)p),pf,buffer[pf]);
55 pf=(pf+1)%BUFFER_SIZE;
56 count_c++;
57 LeaveCriticalSection(&g_cs);
58 ReleaseSemaphore(Empty,1,NULL);
59 }
60 return 0;
61 }
62
63 int main(){
64 printf(" 生产者消费者问题:%d生产者-%d消费者-%d缓冲区-%d个产品\n\n",numofp,numofc,BUFFER_SIZE,numofpr);
65 InitializeCriticalSection(&g_cs);//初始化一个临界区对象
66 //初始化信号量,一个记录有产品的缓冲区个数,另一个记录空缓冲区个数.
67 Empty=CreateSemaphore(NULL,10,10,NULL);
68 Full=CreateSemaphore(NULL,0,10,NULL);
69 const int THREADNUM=numofc+numofp;//线程数
70 HANDLE hThread[THREADNUM];
71 //生产者线程
72 int a=1,b=2,c=3,d=4;
73 hThread[0]=(HANDLE)_beginthreadex(
74 NULL,//安全属性,NULL为默认安全属性
75 0,//指定线程堆栈的大小,一般为0
76 Producer,//指定线程函数的地址
77 &a,//传递给线程的参数的指针
78 0,//线程初始状态,0:立即运行
79 NULL);//用于记录线程ID的地址
80
81 hThread[1]=(HANDLE)_beginthreadex(NULL,0,Producer,&b,0,NULL);
82
83 hThread[2]=(HANDLE)_beginthreadex(NULL,0,Consumer,&c,0,NULL);
84
85 hThread[3]=(HANDLE)_beginthreadex(NULL,0,Consumer,&d,0,NULL);
86 WaitForMultipleObjects(THREADNUM, hThread, TRUE, INFINITE);
87 for (int i = 0; i < THREADNUM; i++)
88 CloseHandle(hThread[i]);
89
90 //销毁信号量和关键段
91 CloseHandle(Empty);
92 CloseHandle(Full);
93 DeleteCriticalSection(&g_cs);
94 system("pause");
95
96 return 0;
97 }

生产者消费者问题c语言实现,布布扣,bubuko.com

时间: 2024-10-08 00:31:25

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

生产者消费者模式(转)

本文转载自博文系列架构设计:生产者/消费者模式.文中对原文格式进行了稍加整理. 概述 今天打算来介绍一下“生产者/消费者模式”,这玩意儿在很多开发领域都能派上用场.由于该模式很重要,打算分几个帖子来介绍.今天这个帖子先来扫盲一把.如果你对这个模式已经比较了解,请跳过本扫盲帖,直接看下一个帖子(关于该模式的具体应用) . 看到这里,可能有同学心中犯嘀咕了:在四人帮(GOF)的23种模式里面似乎没听说过这种嘛!其实GOF那经典的23种模式主要是基于OO的(从书名<Design Patterns: E

Java模拟生产者消费者问题

一.Syncronized方法详解 解决生产者消费这问题前,先来了解一下Java中的syncronized关键字. synchronized关键字用于保护共享数据.请大家注意"共享数据",你一定要分清哪些数据是共享数据,如下面程序中synchronized关键字保护的不是共享数据(其实在这个程序中synchronized关键字没有起到任何作用,此程序的运行结果是不可预先确定的).这个程序中的t1,t2是 两个对象(pp1,pp2)的线程.JAVA是面向对象的程序设计语言,不同的对象的数

python2.0_s12_day9之day8遗留知识(queue队列&amp;生产者消费者模型)

4.线程 1.语法 2.join 3.线程锁之Lock\Rlock\信号量 4.将线程变为守护进程 5.Event事件 * 6.queue队列 * 7.生产者消费者模型 4.6 queue队列 queue非常有用,当信息必须安全的在多个线程之间进行数据交换的时候就应该想到queue 所以,queue它能保证数据被安全的在多个线程之间进行交换,那他就是天生的线程安全. queue有那么几种: class queue.Queue(maxsize=0) # 先入先出 class queue.LifoQ

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

wait(),notify()和notifyAll()都是Java基类java.lang.Object的方法. 通俗解释wait():在当前线程等待其它线程唤醒.notify(): 唤醒一个线程正在等待这个对象的监视器.notifyAll(): 唤醒在这个对象监视器上等待的所有线程.这三个方法,都是Java语言提供的实现线程间阻塞(Blocking)和控制进程内调度(inter-process communication)的底层机制.下面通过一个生产者/消费者的例子来讲解这三个方法的使用 /**

Java线程同步与死锁、生产者消费者模式以及任务调度等

一.Thread类基本信息方法 package Threadinfo; public class MyThread implements Runnable{ private boolean flag = true; private int num = 0; @Override public void run() { while(flag) { System.out.println(Thread.currentThread().getName()+"-->"+num++); } }

13 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件  queue队列 生产者消费者模型 Queue队列 开发一个线程池

本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把

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

实质上,很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式,而这是恰恰是在本科操作系统课堂上老师反复讲解,而我们却视而不见不以为然的.在博文<一种面向作业流(工作流)的轻量级可复用的异步流水开发框架的设计与实现>中将介绍一种生产者/消费者模式的具体应用. 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品.解决生产者/消费者问题的方法可分为两类:(1)采用某种机制保护生产者和消费者之间的同步

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

摘要: Java实现生产者消费者问题与读者写者问题 1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品.解决生产者/消费者问题的方法可分为两类:(1)采用某种机制保护生产者和消费者之间的同步:(2)在生产者和消费者之间建立一个管道.第一种方式有较高的效率,并且易于实现,代码的可控制性较好,属于常用的模式.第二种管道缓冲区不易控制,被传输数据对象不易于封装等,实用性不强. 同步问题核心在

生产者消费者 协同程序 python

因为相对于子例程协程可以有多个入口和出口点,可以用协程来实现任何的子例程.正如Knuth所说:"子例程是协程的特例."因为子例程只返回一次,要返回多个值就要通过集合的形式.这在有些语言,如Forth里很方便:而其他语言,如C,只允许单一的返回值,所以就需要引用一个集合.相反地,因为协程可以返回多次,返回多个值只需要在后继的协程调用中返回附加的值即可.在后继调用中返回附加值的协程常被称为产生器.有些情况下,使用协程的实现策略显得很自然,但是此环境下却不能使用协程.典型的解决方法是创建一个