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是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...
随机推荐
- 开源中国的 IT 公司开源软件整理计划介绍
直击现场 <HTML开发MacOSApp教程> http://pan.baidu.com/s/1jG1Q58M 开源中国的 IT 公司开源软件整理计划介绍 oschina 发布于: 20 ...
- QT中的各种对话框
大家可以参见QT中各种MessageBox的使用的这篇文章 界面效果图如下,大家可以用代码自己操作 diglog.h #ifndef DIALOG_H #define DIALOG_H #includ ...
- 搜索栏+collectionView实现
效果图如下: 1.h文件声明方法: @interface IDSGameRoomSearchPage : UIView @property (nonatomic,weak) BaseVie ...
- U盘免疫
界面如下: 关键部分代码如下: void CImmunityUDlg::OnBnClickedButtonOk() { // TODO: 在此添加控件通知处理程序代码 TCHAR szPath[MAX ...
- Hadoop集群(第3期)机器信息分布表
1.分布式环境搭建 采用4台安装Linux环境的机器来构建一个小规模的分布式集群. 图1 集群的架构 其中有一台机器是Master节点,即名称节点,另外三台是Slaver节点,即数据节点.这四台机器彼 ...
- IIS 站点和应用池命令启动和停止
在CMD下执行如下命令: IIS站点: 停止站点: C:\Windows\System32\inetsrv\appcmd.exe stop site “XXXX” 启动站点: C:\Windows\S ...
- 5分钟学会Java9-Java11的七大新特性
现在Java有多元化的发展趋势,既有JS又有C++还有C#的影子,不学习那是不行滴. 来来来,花5分钟看看Java9-Java11的七大新特性,还有代码样例. Java11 发布了,然而很多公司还在用 ...
- 【MySQL插入更新重复值】ON DUPLICATE KEY UPDATE用法
要插入的数据 与表中记录数据的 惟一索引或主键中产生重复值,那么就会发生旧行的更新 弊端:造成主键自增不连续.适合数据量不大的表. ON DUPLICATE KEY UPDATE后面的条件 eg有如 ...
- 在java项目启动时就执行某操作
在java启动时大概有四种,此处只介绍3种 1.在启动的方法上使用通过@PostConstruct方法实现初始化bean进行操作 2.通过bean实现InitializingBean接口 @Overr ...
- Python基础(八) 模块的引入与定义
模块定义 什么是模块:一个py文件就是一个模块 模块分为三类: 内置模块,(标准库):.python解释器自带的,time,os,sys,等等.200多种. 自定义模块:自己写的模块 第三方库(模块) ...