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是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...
随机推荐
- windows下进程间通信的(13种方法)
转自:http://blog.csdn.NET/shiqz/article/details/5862936 摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进 ...
- redis INFO 解释
以一种易于解释(parse)且易于阅读的格式,返回关于 Redis 服务器的各种信息和统计数值. 通过给定可选的参数 section ,可以让命令只返回某一部分的信息: server 部分记录了 Re ...
- Kafka基本概念介绍
Kafka官方介绍:Kafka是一个分布式的流处理平台(0.10.x版本),在kafka0.8.x版本的时候,kafka主要是作为一个分布式的.可分区的.具有副本数的日志服务系统(Kafka™ is ...
- Hystrix断路器配置属性解析
HystrixCommand 配置方式 我们的配置都是基于 HystrixCommand 的,我们通过在方法上添加 @HystrixCommand 注解并配置注解的参数来实现配置,但有的时候一个类里面 ...
- Python|网页转PDF,PDF转图片爬取校园课表~
import pdfkit import requests from bs4 import BeautifulSoup from PIL import Image from pdf2image imp ...
- .Net将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),并使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA
前言: 前段时间因为项目进度比较繁重所以一直都没有时间更新博客,内心深深的负重感,没有履行年初立下的flag.不过这个月会把上个月没有完成的任务补上来,咱们可不是喜欢拖欠任务的攻城狮.哈哈,废话不多说 ...
- js 数组去重方法
var arr = ['a',1,2,3,'a',4,2,3,1,4,2,8,10,null,'a']; // 方法一 var newArr = [...new Set(arr)]; console. ...
- 【JDK基础】java基础的一些资料
工具:https://blog.csdn.net/javazejian/article/details/72828483 类加载器:https://blog.csdn.net/X5fnncxzq4/a ...
- 【过时】项目转Maven后出现的问题记录
上图,文字后补充 1.过程 创建一个新的web项目,项目名称与原项目名称一致.注意勾选“添加mvn支持(红框部分)”,勾选后运行目标服务器会变为none,这里无法进行添加. 2.项目创建完成后,会报错 ...
- Null作为参数的时候,Java编译器如何调用函数?
public class TestNull { public void method(Object o){ System.out.println("Object Version") ...