#include<windows.h>
#include<stdio.h>
#define MAX_BUFFER 5
#define MAX_NUM 10
HANDLE mutex;
HANDLE full;
HANDLE empty;
int product=0;
int count=0;
//初始化缓冲区为全0
int buffer[MAX_BUFFER]={0};
//显示缓冲区内容
void showBuffer(){
int i=0;
printf("-------------------------------缓冲区内容:");
for(i=0;i<MAX_BUFFER;i++){
printf("%d ",buffer[i]);
}
printf("\n");
}
//生产者线程
DWORD WINAPI producer(LPVOID lpParam){
int i=(int)lpParam;
while(i--){
WaitForSingleObject(empty,INFINITE);
WaitForSingleObject(mutex,INFINITE);
product++;
buffer[count]=product;
printf("生产者生产了一个数据 %d.\n",product);
showBuffer();
count++;
if(count>=MAX_BUFFER){
printf("\n缓冲区已满,暂时无法生产,请稍等....\n");
}
ReleaseSemaphore(mutex,1,NULL);
ReleaseSemaphore(full,1,NULL);
}
return 0;
}
//消费者线程
DWORD WINAPI consumer(LPVOID lpParam){
int i=(int)lpParam;
while(i--){
WaitForSingleObject(full,INFINITE);
WaitForSingleObject(mutex,INFINITE);
count--;
printf("消费者从缓冲区取走数据 %d.\n",buffer[count]);
buffer[count]=0;
showBuffer();
if(count<=0){
printf("\n缓冲区为空,暂时无法取数,请稍等...\n");
}
ReleaseSemaphore(mutex,1,NULL);
ReleaseSemaphore(empty,1,NULL);
}
return 0;
}
int main(){
HANDLE hThread[MAX_NUM*2];
DWORD dwThread[MAX_NUM*2];
printf("\n\n*************************生产者与消费者问题**********************\n\n");
printf("注:缓冲区长度为5,0代表缓冲区为空!\n");
//创建三个信号量:mutex,full,empty
mutex=CreateSemaphore(NULL,1,1,NULL);
full=CreateSemaphore(NULL,0,MAX_BUFFER,NULL);
empty=CreateSemaphore(NULL,MAX_BUFFER,MAX_BUFFER,NULL);
//创建10个生产者和10个消费者
for(int i=0;i<MAX_NUM*2-1;i++){
hThread[i]=CreateThread(NULL,NULL,producer,(LPVOID)(MAX_BUFFER),0,&dwThread[i]);
hThread[i+1]=CreateThread(NULL,NULL,consumer,(LPVOID)(MAX_BUFFER),0,&dwThread[i+1]);
if(hThread[i]==NULL) {
printf("创建线程失败.\n");
system("pause");
return 0;
}
if(hThread[i]==NULL) {
printf("创建线程失败.\n");
system("pause");
return 0;
}
i++;
}
//等待所有的线程结束,关闭句柄对象
WaitForMultipleObjects(MAX_NUM*2,hThread,TRUE,INFINITE);
//撤销信号量
CloseHandle(mutex);
CloseHandle(empty);
CloseHandle(full);
//撤销所有线程
for(i=0;i<MAX_NUM*2;i++){
CloseHandle(hThread[i]);
printf(" 撤消线程%d.\n",i+1);
}
system("pause");
return 0;
}
pv.zip_生产者与消费者
版权申诉
30 浏览量
2022-09-20
23:40:00
上传
评论
收藏 1KB ZIP 举报
寒泊
- 粉丝: 74
- 资源: 1万+
最新资源
- 基于11B-MC串口USB温度传感器MODBUS RTU( DL11B-MC-D1),python语言读取环境温度
- 离线ip 地址xdb 文件
- js-leetcode题解之移除元素-题解.zip
- PHP语言基础知识(超详细).txt
- js-leetcode题解之验证子序列-题解.zip
- js-leetcode题解之验证平衡二叉树-题解.zip
- CSS前端示例:看似需要 JavaScript 实现的效果,其实仅用到了 CSS 的示例集合
- 基于deeplabv3plus网络实现了虹膜图像分割以及水果图像分割python源码+运行说明.zip
- 西南科技大学Python题库.txt
- STM32驱动 AT21CS01 单总线eeprom 源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈