#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下。的更多相关文章

  1. 【Windows】用信号量实现生产者-消费者模型

    线程并发的生产者-消费者模型: 1.两个进程对同一个内存资源进行操作,一个是生产者,一个是消费者. 2.生产者往共享内存资源填充数据,如果区域满,则等待消费者消费数据. 3.消费者从共享内存资源取数据 ...

  2. linux下多线程互斥量实现生产者--消费者问题和哲学家就餐问题

    生产者消费者问题,又有界缓冲区问题.两个进程共享一个一个公共的固定大小的缓冲区.其中一个是生产者,将信息放入缓冲区,另一个是消费者,从缓冲区中取信息. 问题的关键在于缓冲区已满,而此时生产者还想往其中 ...

  3. C++11 并发指南九(综合运用: C++11 多线程下生产者消费者模型详解)

    前面八章介绍了 C++11 并发编程的基础(抱歉哈,第五章-第八章还在草稿中),本文将综合运用 C++11 中的新的基础设施(主要是多线程.锁.条件变量)来阐述一个经典问题——生产者消费者模型,并给出 ...

  4. 综合运用: C++11 多线程下生产者消费者模型详解(转)

    生产者消费者问题是多线程并发中一个非常经典的问题,相信学过操作系统课程的同学都清楚这个问题的根源.本文将就四种情况分析并介绍生产者和消费者问题,它们分别是:单生产者-单消费者模型,单生产者-多消费者模 ...

  5. java线程基础巩固---多线程下的生产者消费者模型,以及详细介绍notifyAll方法

    在上一次[http://www.cnblogs.com/webor2006/p/8419565.html]中演示了多Product多Consumer假死的情况,这次解决假死的情况来实现一个真正的多线程 ...

  6. 操作系统实验 windows编程多线程 生产者消费者问题 画圆画方(内置bug版)

    实验3:随便写的 #include <windows.h> #include <string> #include <stdio.h> #pragma warning ...

  7. C++11 生产者消费者

    下面是一个生产者消费者问题,来介绍condition_variable的用法.当线程间的共享数据发生变化的时候,可以通过condition_variable来通知其他的线程.消费者wait 直到生产者 ...

  8. c++11 生产者/消费者

    下面是一个生产者消费者问题,来介绍condition_variable的用法.当线程间的共享数据发生变化的时候,可以通过condition_variable来通知其他的线程.消费者wait 直到生产者 ...

  9. 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼

    1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...

随机推荐

  1. 搭建基于.NetFrameWork的私有nuget服务端及打包项目发布上传

    一.私有Nuget服务端搭建 1.创建一个.NetFramework web项目 2.在nuget管理中 安装 nuget.server包 3.安装完成后修改web.config里面的 apikey ...

  2. HTML连载11-HTML中被废弃的标签&字符实体

    ​一.为什么会有被废弃的标签 答:HTML中以前存在一部分不是用来添加语义的标签,而与我们HTML标签是用来添加语义的,这与我们的定义不相符. 例如: 1.标签<br>:换行 2.标签&l ...

  3. # 构建以及运行Springboot Docker镜像时的变量传递

    Docker可以把我们的运行环境打包,然后我们只要run就可以了.大部分hello world都是这么写的.但都缺少了实际应用环节.以springboot为例,hello world的Dockerfi ...

  4. Spring Boot的学习之路(01):缘起

    有人说,Spring Boot的出现,让Java迎来了又一春,它是Java应用开发的颠覆者,彻底改变了Java应用开发的模式. 2017年,SpringBoot闯入我的生活, 也让我迎来了又一春 我开 ...

  5. 原创-使用pywinauto进行dotnet的winform程序控制(一)

    pywinauto自动化控制win32的ui的程序,网上有好多的教程.但是操作dotnet写的winform教程,就少之又少.今天我就来分享我的pywinauto操作dotnet的winform的研究 ...

  6. SHELL 中条件语句的运用 if for 条件测试语句

    if条件测试语句可以让脚本根据实际情况自动执行相应的命令.从技术角度来讲,if语句分为单分支结构.双分支结构.多分支结构:其复杂度随着灵活度一起逐级上升. if条件语句的单分支结构由if.then.f ...

  7. [hdu-6395]Sequence 分块+矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6395 因为题目数据范围太大,又存在递推关系,用矩阵快速幂来加快递推. 每一项递推时  加的下取整的数随 ...

  8. Java连载3-编译与运行阶段详解&JRE,JDK,JVM关系

    ·一. 1.JDK下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk12-downloads-5295953.html ...

  9. Java Volatile 关键字详解

    原文链接:https://www.cnblogs.com/zhengbin/p/5654805.html 一.基本概念 先补充一下概念:Java 内存模型中的可见性.原子性和有序性. 可见性: 可见性 ...

  10. 开源FTP/SFTP客户端 FileZilla v3.31.0 绿色便携版

    下载地址:点我 基本介绍 FileZilla是一种快速.可信赖的FTP客户端以及服务器端开放源代码程式,具有多种特色.直觉的接口.可控性.有条理的界面和管理多站点的简化方式使得Filezilla客户端 ...