c实现生产者消费者问题。 windows下。
#include <stdio.h>
#include <windows.h>
#define P(S) WaitForSingleObject(S,INFINITE)//定义Windows下的P操作
#define V(S) ReleaseSemaphore(S,1,NULL)//定义Windows下的V操作
//生产者 消费者 缓冲区
#define num_of_productors 2
#define num_of_consumers 3
#define num_of_buffers 3
int nextp = 1; //下一个产品的编号
int in = 0, out = 0; //分别指向下一个存放产品和取出产品的缓冲区编号
int g_Buffer[num_of_buffers] = { 0 }; //缓冲区初始值为空
HANDLE g_hSemaphoreEmpty, g_hSemaphoreFull, g_hMutex;
//生产者线程函数
DWORD WINAPI ProducerThreadFun(LPVOID pM)
{
Sleep(100);
do{
int id = *((int*)(pM)); //生产者编号
P(g_hSemaphoreEmpty);
P(g_hMutex);
g_Buffer[in] = nextp;
printf("生产者%d将数据%d放入缓冲区%d\n", id, nextp, in);
nextp++;
in = (in + 1) % num_of_buffers;
V(g_hMutex);
V(g_hSemaphoreFull);
Sleep(100);
if (nextp > 12) break;
} while(true);
return 0;
}
//消费者线程函数
DWORD WINAPI ConsumerThreadFun(LPVOID pM)
{
Sleep(100);
do
{
int id = *((int*)(pM)); //消费者编号
P(g_hSemaphoreFull);
P(g_hMutex);
//nextp = g_Buffer[out];
printf(" 消费者%d从缓冲区%d中取数据%d\n", id, out, g_Buffer[out]);
out = (out + 1) % num_of_buffers;
V(g_hMutex);
V(g_hSemaphoreEmpty);
Sleep(100);
} while (true);
}
int main()
{
int num[num_of_productors + num_of_consumers];
printf(" 生产者消费者问题:%d生产者 %d消费者 %d缓冲区\n", num_of_productors, num_of_consumers, num_of_buffers);
//初始值为num_of_buffers的信号量
g_hSemaphoreEmpty = CreateSemaphore(NULL, num_of_buffers, num_of_buffers, NULL); //继承/初始化信号计数/最大信号计数/名称
//初始值为0的信号量
g_hSemaphoreFull = CreateSemaphore(NULL, 0, num_of_buffers, NULL);
//互斥量
g_hMutex = CreateSemaphore(NULL, 1, 1, NULL);
const int THREADNUM = num_of_productors + num_of_consumers; //线程数
HANDLE hThread[THREADNUM];
for (int i = 0; i < num_of_productors; i++) //创建生产者线程
{
num[i] = i + 1;
hThread[i] = CreateThread(NULL, 0, ProducerThreadFun, (LPVOID *)&num[i], 0, NULL);
} //继承/初始栈大小/线程函数/向线程函数传递的参数/线程标志 0 表示创建后立即激活/保存新线程的ID
for (int i = num_of_productors; i < num_of_productors + num_of_consumers; i++) //创建消费者者线程
{
num[i] = i - num_of_productors + 1;
hThread[i] = CreateThread(NULL, 0, ConsumerThreadFun, (LPVOID *)&num[i], 0, NULL);
}
WaitForMultipleObjects(THREADNUM, hThread, TRUE, INFINITE);
system("pause");
return 0;
}
c实现生产者消费者问题。 windows下。的更多相关文章
- 【Windows】用信号量实现生产者-消费者模型
线程并发的生产者-消费者模型: 1.两个进程对同一个内存资源进行操作,一个是生产者,一个是消费者. 2.生产者往共享内存资源填充数据,如果区域满,则等待消费者消费数据. 3.消费者从共享内存资源取数据 ...
- linux下多线程互斥量实现生产者--消费者问题和哲学家就餐问题
生产者消费者问题,又有界缓冲区问题.两个进程共享一个一个公共的固定大小的缓冲区.其中一个是生产者,将信息放入缓冲区,另一个是消费者,从缓冲区中取信息. 问题的关键在于缓冲区已满,而此时生产者还想往其中 ...
- C++11 并发指南九(综合运用: C++11 多线程下生产者消费者模型详解)
前面八章介绍了 C++11 并发编程的基础(抱歉哈,第五章-第八章还在草稿中),本文将综合运用 C++11 中的新的基础设施(主要是多线程.锁.条件变量)来阐述一个经典问题——生产者消费者模型,并给出 ...
- 综合运用: C++11 多线程下生产者消费者模型详解(转)
生产者消费者问题是多线程并发中一个非常经典的问题,相信学过操作系统课程的同学都清楚这个问题的根源.本文将就四种情况分析并介绍生产者和消费者问题,它们分别是:单生产者-单消费者模型,单生产者-多消费者模 ...
- java线程基础巩固---多线程下的生产者消费者模型,以及详细介绍notifyAll方法
在上一次[http://www.cnblogs.com/webor2006/p/8419565.html]中演示了多Product多Consumer假死的情况,这次解决假死的情况来实现一个真正的多线程 ...
- 操作系统实验 windows编程多线程 生产者消费者问题 画圆画方(内置bug版)
实验3:随便写的 #include <windows.h> #include <string> #include <stdio.h> #pragma warning ...
- C++11 生产者消费者
下面是一个生产者消费者问题,来介绍condition_variable的用法.当线程间的共享数据发生变化的时候,可以通过condition_variable来通知其他的线程.消费者wait 直到生产者 ...
- c++11 生产者/消费者
下面是一个生产者消费者问题,来介绍condition_variable的用法.当线程间的共享数据发生变化的时候,可以通过condition_variable来通知其他的线程.消费者wait 直到生产者 ...
- 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼
1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...
随机推荐
- Color gradient in Delphi FireMonkey
Introduction to color gradients in Delphi FireMonkey. Video This video covers the basics of color gr ...
- ASP.NET 5 牛刀小試(二):加入第三方 DI 容器
上回介绍了 ASP.NET vNext 自带容器的基本用法,这次要试试把 ASP.NET vNext 的自带容器换成 Autofac. 这一次,在编写范例程序的过程中,光是解决 KRE 与相关套件的版 ...
- CAP碎碎念
整个2017年都在搞大数据平台,完全远离了机器学习,甚至都不记得写过类似ETL的job. 从数据到平台,从业务处理到基础服务. Metrics的收集,报警,生成报表.Data pipeline的准确性 ...
- Realm_King 之 .NET 打包详细教程(A)
最近一直在winform程序开发,听说身边的人不是很了解打包,给大家提供一点简单的打包,相信能看懂的... (一)右键解决方案: 在弹出"添加新项目"窗体中找到 其他项目类型=& ...
- [2017.02.23] Java8 函数式编程
以前学过Haskell,前几天又复习了其中的部分内容. 函数式编程与命令式编程有着不一样的地方,函数式编程中函数是第一等公民,通过使用少量的几个数据结构如list.map.set,以及在这些数据结构上 ...
- Linux使用daemontools
功能: 在使用memcached时候,怕因为一些不可预知的因素导致memcached进程死掉,而又不能及时的发现重启,可以通过daemontools来管理memcached的启动,当memcached ...
- OpenStack 通过某类可用域查找相应虚拟机使用的flavor模板
nova availability-zone-list:列出集群的所有可用域 截取部分结果: 通过可用域上的宿主机找相应的虚拟机 查看命令 通过 nova list --all-tenant --h ...
- 【Dubbo】Dubbo+ZK基础入门以及简单demo
参考文档: 官方文档:http://dubbo.io/ duboo中文:https://dubbo.gitbooks.io/dubbo-user-book/content/preface/backgr ...
- Java:Web Service初入门
前言 Web Service技术在我第一次接触,又没有实际使用时完全不理解这是什么.以为是一种类似Spring,Shiro的编程框架.后来渐渐理解,WS(即Web Service缩写)是一种通用的接口 ...
- 【Go】使用压缩文件优化io (二)
原文链接: https://blog.thinkeridea.com/201907/go/compress_file_io_optimization2.html 上一篇文章<使用压缩文件优化io ...