C语言 生产者消费者问题

article/2025/11/10 0:46:15

目录

  • 生产者消费者问题
  • 算法设计
  • 实现
  • 源程序
  • 测试日志
  • 总结


生产者消费者问题

问题

算法设计

算法

实现

1.编写所需头文件

#include<stdio.h>
#include<Windows.h>

2.定义全局变量

#define productor 2  //生产者数目 为2
#define consumers 3  //消费者数目 为3
#define buffers 10    //缓冲区数目 为10
int nextp1 = 1000;   //生产者1生产数据
int nextp2=2000;	    //生产者2生产数据
int buf[buffers] = { 0 };	//缓冲区数组
FILE *fpWrite=fopen("D:\\4.txt","w");  //日志文件写入位置

3.编写相关信号量

empty = CreateSemaphore(NULL, buffers, buffers, NULL);   //信号量,缓冲区空位数量
full = CreateSemaphore(NULL, 0, buffers, NULL);          //信号量,缓冲区数据的个数
huchu = CreateSemaphore(NULL, 1, 1, NULL);           //信号量,缓冲区互斥使用

第二个参数为初始量,第三个参数为最大值
4.编写创建线程函数

hThread[i] = CreateThread(NULL, 0, producer, (LPVOID*)&pID[i], 0, NULL);  //创建生产者线程
hThread[i + productor] = CreateThread(NULL, 0, consumer, (LPVOID*)&cID[i], 0, NULL);  //创建消费者进程

5.编写生产者,消费者相关函数
生产者关键代码:

P(empty);
P(huchu);
if(id==1){buf[in] = nextp1;fprintf(fpWrite,"生产者%d 将数据%d 放入缓冲区%d\n", id, nextp1, in);nextp1++;}
else{buf[in]=nextp2;fprintf(fpWrite,"生产者%d 将数据%d 放入缓冲区%d\n", id, nextp2, in);nextp2++;}   //通过ID判断是哪一个生产者,生产不同数据
V(huchu);
V(full);

消费者关键代码:

P(full);
P(huchu);fprintf(fpWrite,"\t\t\t\t\t\t消费者%d 将数据%d 取出缓冲区%d\n", id, num, out);
out = (out + 1) % buffers;
V(huchu);
V(empty);

6.编写线程关闭,IO关闭

WaitForMultipleObjects(num_of_thread, hThread, TRUE, INFINITE);
printf("写入完成\n");

源程序

#include<stdio.h>
#include<Windows.h>
#define productor 2
#define consumers 3
#define buffers 10
#define P(S)  WaitForSingleObject(S,INFINITE) 
#define V(S)  ReleaseSemaphore(S,1,NULL)	  int nextp1 = 1000;
int nextp2=2000;						
int in = 0, out = 0;				
int buf[buffers] = { 0 };	
FILE *fpWrite=fopen("D:\\4.txt","w");  HANDLE empty, full;			
HANDLE huchu;				DWORD WINAPI producer(LPVOID pM)
{while (true){int id = *((int*)(pM));	Sleep(100);P(empty);P(huchu);Sleep(100);if(id==1){buf[in] = nextp1;fprintf(fpWrite,"生产者%d 将数据%d 放入缓冲区%d\n", id, nextp1, in);nextp1++;}else{buf[in]=nextp2;fprintf(fpWrite,"生产者%d 将数据%d 放入缓冲区%d\n", id, nextp2, in);nextp2++;}in = (in + 1) % buffers;V(huchu);V(full);if (nextp1 > 1200||nextp2>2200){fclose(fpWrite);break;}}return 0;
}
DWORD WINAPI consumer(LPVOID pM){while (true){int id = *((int*)(pM));	Sleep(100);P(full);P(huchu);Sleep(100);int num = buf[out];buf[out] = 0;fprintf(fpWrite,"\t\t\t\t\t\t消费者%d 将数据%d 取出缓冲区%d\n", id, num, out);out = (out + 1) % buffers;V(huchu);V(empty);if (nextp1 > 1200||nextp2>2200){fclose(fpWrite);break;}}return 0;
}
int main()
{fprintf(fpWrite,"\t\t\t生产者消费者问题:%d生产者 %d消费者 %d缓冲区\n\n", productor, consumers, buffers);empty = CreateSemaphore(NULL, buffers, buffers, NULL);full = CreateSemaphore(NULL, 0, buffers, NULL);huchu = CreateSemaphore(NULL, 1, 1, NULL);const int num_of_thread = consumers + productor;HANDLE hThread[num_of_thread];int pID[2];for (int i = 0; i < productor; i++){pID[i]= i + 1;hThread[i] = CreateThread(NULL, 0, producer, (LPVOID*)&pID[i], 0, NULL);}int cID[2];for (int i = 0; i < consumers; i++){cID[i] = i + 1;hThread[i + productor] = CreateThread(NULL, 0, consumer, (LPVOID*)&cID[i], 0, NULL);}WaitForMultipleObjects(num_of_thread, hThread, TRUE, INFINITE);printf("写入完成\n");getchar();return 0;
}

测试日志

测试日志


总结

本文介绍并实现了生产者消费者经典进程同步问题。
有任何问题都可以在评论区和我交流~~


http://chatgpt.dhexx.cn/article/1r8KiEvE.shtml

相关文章

操作系统_生产者消费者问题

目录 1&#xff0c;生产者消费者问题 问题的提出 初步思考 进程资源共享关系和同步关系分析 问题的具体解决 第一搏 存在的问题 第二搏 多维度思考 1&#xff0c;单生产者、单消费者、多缓冲区 2&#xff0c;多生产者、多消费者、单缓冲 3&#xff0c;单生产者、单…

超详解“生产者消费者问题”【操作系统】

目录 一.生产者消费者问题&#xff08;问题描述&#xff09; 二.问题分析 三.背景知识 四.代码实现 五.实验结论 一.生产者消费者问题&#xff08;问题描述&#xff09; 有一个生产者在生产产品&#xff0c;这些产品将提供给一个消费者去消费&#xff0c;为了使生产者和消…

生产者消费者问题

文章目录 1.生产者消费者问题1.1 问题描述1.2 问题分析1.3 如何实现1.4 思考① -> ② -> ③③ -> ④ -> ① 1.5 小结 2.多生产者 - 多消费者2.1 问题描述2.2 问题分析2.3 如何实现2.4 小结 1.生产者消费者问题 1.1 问题描述 系统中有一组生产者进程和一组消费者进…

《操作系统》-生产者消费者问题

什么是生产者消费者问题&#xff1f; 系统中有一组生产者进程和一组消费者进程。生产者进程每次生产一个产品放入缓冲区&#xff0c;消费者进程每次从缓冲区中取出一个进程并使用&#xff0c;那么他们之间具有这样一层关系 生产者、消费者共享一个初始为空、大小为n的缓冲区。…

生产者-消费者问题(操作系统)

生产者-消费者问题从特殊到一般(从易到难)可以分3种形式&#xff1a; 一个生产者、一个消费者、一个缓冲区的问题&#xff1b; 一个生产者、一个消费者、n个缓冲区的问题&#xff1b; k个生产者、m个消费者、n个缓冲区的问题&#xff1b; ★当缓冲区空时&#xff0c;生产者可…

Java多线程——生产者消费者问题

创建多个线程去执行不同的任务&#xff0c;如果这些任务之间有着某种关系&#xff0c;那么线程之间必须能够通信来协调完成工作。 生产者消费者问题&#xff08;英语&#xff1a;Producer-consumer problem&#xff09;就是典型的多线程同步案例&#xff0c;它也被称为有限缓冲…

生产者-消费者问题(详解)

目录 1.问题描述 2.问题分析 3.问题实现 3.1 初始化 3.2 生产者 3.3 消费者 1.问题描述 要求如下&#xff1a; 只要缓冲区没满&#xff0c;生产者才能把产品放入缓冲区&#xff0c;否则必须等待。只有缓冲区不空时&#xff0c;消费者才能从中取出产品&#xff0c;否则必…

【操作系统】生产者消费者问题

生产者消费者模型 文章目录 生产者消费者模型 [toc]一、 生产者消费者问题二、 问题分析三、 伪代码实现四、代码实现&#xff08;C&#xff09;五、 互斥锁与条件变量的使用比较 一、 生产者消费者问题 生产者消费者问题&#xff08;英语&#xff1a;Producer-consumer proble…

Sublime Text实现代码自动生成,快速编写HTML/CSS代码

目录 下载Sublime Text安装emmet插件常用自动生成HTML代码实例初始化页面自动补全标签配对自动添加类名和id名自动填充文本内容自动生成同级标签自动生成嵌套标签自动生成提级标签自动生成分组标签自动生成多个元素自动生成带多个属性的元素自动生成隐式标签 常用自动生成CSS代…

MybatisPlus代码自动生成

这里写自定义目录标题 前言一. 什么是 MyBatis-Plus二.MybatisPlus 代码自动生成①idea 插件生成1. 插件2.连接数据源3.生成代码 ②配置工具类生成 前言 最开始&#xff0c;要在 Java 中使用数据库时&#xff0c;需要使用 JDBC&#xff0c;创建 Connection、ResultSet 等&…

Simulink自动代码生成:生成代码的基本设置

Simulink自动代码生成也被称作基于模型开发&#xff08;BMD&#xff09;&#xff0c;相比于传统的手写代码方式能够尽量减少人为错误。模型本身可以用于仿真&#xff0c;单元测试等&#xff0c;更便于提前发现逻辑错误。同时只要约定好模型接口&#xff0c;就可以多人协作&…

C语言代码自动生成工具

一、模型建模模块&#xff1a; 基于开源开发平台Eclipse&#xff0c;以图形方式创建和编辑模型元素&#xff0c;模型元素如下&#xff1a; 活动&#xff1a;初始活动、简单活动、复杂活动、结束活动&#xff1b;状态&#xff1a;初始状态、状态、结束状态&#xff1b;变迁&a…

前端代码自动生成器

场景 1.CodeFun是什么 CodeFun是一款UI 设计稿智能生成源代码的工具,支持微信小程序端、移动端H5和混合APP,上传 Sketch、PSD等形式的设计稿&#xff0c;通过智能化技术一键生成可维护的前端代码. 2.学习成本高吗&#xff1f; 对于前端工程师来说&#xff0c;几乎没有学习成本…

MATLAB/Simulink自动代码生成(一)

Simulink自带了种类繁多、功能强大的模块库&#xff0c;在基于模型设计的开发流程下&#xff0c;Simulink不仅通过仿真可以进行早期设计的验证&#xff0c;还可以生成C/C、PLC等代码直接应用于PC、MCU、DSP等平台。在嵌入式软件开发中发挥着重要的作用&#xff0c;本文以Simuli…

IDEA自动生成代码插件

官方介绍 基于IntelliJ IDEA开发的代码生成插件&#xff0c;支持自定义任意模板&#xff08;Java&#xff0c;html&#xff0c;js&#xff0c;xml&#xff09;。 只要是与数据库相关的代码都可以通过自定义模板来生成。支持数据库类型与java类型映射关系配置。 支持同时生成生…

Matlab/Simulink自动生成C代码实验

目录 0. 概要 1. Matlab /Simulink/Embedded Coder关系与区别 2. 搭建Simulink模型及仿真 2.1 搭建模型 2.2 仿真 3. 生成代码 3.1 求解器设置为定步长 3.2 安装 MinGW-w64 编译器 3.3 调出Simulink Coder 4. 工具都生成了啥呢&#xff1f; 0. 概要 Matlab网站提供了很多…

关于RuoYi自动代码生成功能的使用

为什么要使用代码生成&#xff1f; 答&#xff1a;因为在后端构建的过程中会有许多重复的类似的代码编写&#xff0c;而我们如果一个个去编写&#xff0c;会耗费大量时间与精力&#xff0c;所以我们可以设计一个功能去自动生成这些重复的&#xff0c;简单的代码。而若依系统就…

Mybatis Plus自动生成代码

mybatis-plus自动生成代码 一、简易生成代码二、指定生成的样式&#xff0c;并且不在一个模块1.父pom文件配置2.子模块pom文件配置3.准备vm文件4.设置MyBatisPlusGenerator.java5.运行MyBatisPlusGenerator.java文件6.运行sign-auth模块,解决异常 一、简易生成代码 /*** 代码生…

Simulink自动代码生成:数据类型别名自定义

在手写代码时&#xff0c;我们经常能看到自定义数据类型别名&#xff0c;例如有些代码中将计算机默认的数据类型改为我们自己习惯的名称&#xff0c;如图所示。 目录 一. 系统默认生成的别名二. 建立Simulink AliasType三. 修改Data Type Replacement四. 数据类型别名修改后的…

Simulink 自动代码生成原理

如下图&#xff0c;Simulink模型会先变成一个文本式的 .rtw 模型描述文件&#xff0c;然后再变成 .c,.h&#xff0c;最后编译为最终目标文件。 典型的 Simulink 用户通常都是&#xff0c;用Simulink设计好算法后&#xff0c;做到生成源代码这一步。然后把生成的算法的.c .h 源代…