生产者消费者同步问题c++|操作系统

[操作系统]生产者-消费者问题 C++实现 生产者-消费者问题 C++实现 阅读详情

这是生产者消费者同步问题的c++程序,如果对其中函数有不理解的可以看我另一篇博客进程相关函数汇总解释,对照着看,可能方便你理解

在这里插入图片描述

#include <Windows.h>
#include <iostream>
#define SIZE_OF_BUFFER 10
using namespace std;
typedef HANDLE semaphore;

//
#define P(S) WaitForSingleObject(S,INFINITE)
#define V(S) ReleaseSemaphore(S,1,NULL)

int g_buffer[10];
int in = 0;
int out = 0;
int ProduceID = 1000;
int CousumeID;

DWORD WINAPI Producer(LPVOID lpPara);
DWORD WINAPI Consumer(LPVOID lpPara);
semaphore g_hEmptySemaphore = CreateSemaphore(NULL, 10, 10, NULL);
semaphore g_hFullSemaphore = CreateSemaphore(NULL, 0, 10, NULL);
semaphore g_hMutex = CreateSemaphore(NULL, 1, 1, NULL);

void print();
int x = 0;
int y = 0;

void main()
{
	HANDLE hThread1;
	HANDLE hThread2;
	hThread1 = CreateThread(NULL, 0, Producer, NULL, 0, NULL);
	hThread2 = CreateThread(NULL, 0, Consumer, NULL, 0, NULL);
	while (1)
	{
		WaitForSingleObject(hThread1, INFINITE);
		WaitForSingleObject(hThread2, INFINITE);
	}
}

int color(int num)
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), num);
	return 0;
}

void gotoxy(int x, int y)
{
	HANDLE hCon;
	hCon = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD Pos;
	Pos.X = x;
	Pos.Y = y;
	SetConsoleCursorPosition(hCon, Pos);
}

void print()
{
	for (int i = 0; i < SIZE_OF_BUFFER; i++)
	{
		gotoxy(40, i + 5);
		if (i == in)
			color(1);
		else if (i == out)
			color(4);
		else
			color(7);
		std::cout << i << ":" << g_buffer[i];
	}
}


//生产一个产品
void Produce()
{
	++ProduceID;
}

//把新生产的产品放入缓冲区
void Append()
{
	color(7);
	g_buffer[in] = ProduceID;
	if (y == 25)
	{
		y = 0;
		system("cls");
	}
	gotoxy(x, y++);
	std::cout << "生产者生产了" << g_buffer[in];
	std::cout << std::endl;
	print();
	in = (in + 1) % SIZE_OF_BUFFER;
}

//取出一个产品
void Take()
{
	color(7);
	CousumeID = g_buffer[out];
	if (y == 25)
	{
		y = 0;
		system("cls");
	}

	gotoxy(x, y++);
	std::cout << "\t\t消费者消费了" << CousumeID;
	g_buffer[out] = 1000;
	print();
	out = (out + 1) % SIZE_OF_BUFFER;
}


DWORD WINAPI Producer(LPVOID lpPara)
{
	while (1)
	{
		P(g_hEmptySemaphore);
		P(g_hMutex);
		Produce();
		Append();
		Sleep(1500);
		V(g_hMutex);
		V(g_hFullSemaphore);
	}
	return 0;
}

DWORD WINAPI Consumer(LPVOID lpPara)
{
	while (1)
	{
		P(g_hFullSemaphore);
		P(g_hMutex);
		Take();
		Sleep(1500);
		V(g_hMutex);
		V(g_hEmptySemaphore);
	}
	return 0;
}

操作系统-生产者与消费者问题的C语言实现 1.模拟用信号量机制实现生产者和消费者问题。 2.设计报告内容应说明: ⑴ 课程设计目的与功能; ⑵ 需求分析,数据结构或模块说明(功能与框图); ⑶ 源程序的主要部分; ⑷ 运行结果与运行情况分析; ⑸ 自我评价与总结: 立即下载

相关推荐

R语言实战:Scheirer–Ray–Hare检验在非正态重复测量数据分析中的应用

本文详细介绍了当重复测量数据不满足正态分布假设时,如何利用R语言中的Scheirer–Ray–Hare检验进行数据分析。该检验作为非参数方法,无需数据服从正态分布或方差齐性,适用于分析组间差异、时间效应及其交互作用。文章通过实战案例,从环境搭建、数据准备、检验执行到结果解读与可视化,提供了完整的操作指南,帮助研究者有效处理心理学、医学等领域的复杂实验数据。

salt9的博客 780

生产者和消费者多线程同步,C++实现

首先来简化问题,先假设生产者和消费者都只有一个,且缓冲区也只有一个。   第一.从缓冲区取出产品和向缓冲区投放产品必须是互斥进行的。可以用关键段和互斥量来完成。     第二.生产者要等待缓冲区为空,这样才可以投放产品,消费者要等待缓冲区不为空,这样才可以取出产品进行消费。并且由于有二个等待过程,所以要用二个事件或信号量来控制。 #pragma once #include #in

don_lvsml的专栏 1774

FastAPI + LLM 实战:5分钟搞定本地模型API服务部署(含避坑指南)

本文详细介绍了如何使用FastAPI和LLM(大语言模型)快速部署本地API服务,涵盖环境准备、模型集成、性能优化及避坑指南。通过实战示例,帮助开发者在5分钟内完成从零到生产的部署过程,提升AI应用开发效率。

weixin_29062963的博客 106

C++实现经典同步问题(生产者消费者、读者写者、哲学家进餐、吸烟者问题)

C++实现经典同步问题(生产者消费者、读者写者、哲学家进餐、吸烟者问题)

jasean_的博客 5017

25届电信保研经验贴(空天院)

学校:中九专业:电子信息工程加权:92.89绩点:3.91/4.0rank:前五学期rank2/95,综合排名rank1(前六学期和综合排名出的晚,实际上只用到了前五学期)科研竞赛:市级大创、数模省一、数竞省二,其他校奖若干英语:六级462、四级548个人感觉:rank=科研>竞赛>英语总之rank和科研必须得有一项,要么就rank高,很多强com院校入营看rank。我rank比较有优势,因此报的多是强com院校。要么就科研经历丰富,多主动联系老师,特别是弱com院校。冬令营:空天院。

qq_68608661的博客 6353

MiniMAX H3官方SKILL三段式提示词模板与本地部署全解

视频生成模型的效果高度依赖于提示词的结构与质量,而提示词工程正是连接自然语言与视觉表达的关键桥梁。在文本模型之外,视频模型对场景、角色、镜头动作的信息层次更为敏感,普通自由描述往往导致画面漂移、风格不稳定。MiniMAX H3 作为社区热议的视频生成模型,通过一套官方 SKILL 三段式提示词模板,将环境、主体、镜头动作分类组织,免API、免推理即可稳定产出风格统一的素材。这一设计不仅降低了提示词编写门槛,也提升了多轮生成的复用性,适合短视频生产、影视概念设计及自动化视频流水线等场景。本文围绕该模板的结构与

weixin_33309048的博客 1187

用C++实现生产者-消费者问题模型

用C++来实现生产者与消费者的模型,同时稍微讲解一点可能要讲解的地方。

qq_35160090的博客 1万+

目前最新NIST随机数测试软件下载、安装、及使用教程

最近由于科研需要,在搞一些随机数的测试的事情,众所周知 随机数测试我们可以使用NIST的软件进行多大15项的随机测试,我也在网上查找了很多大牛的博客,但是都是年代久远,很多的链接现在都是物是人非,都是不能直接使用了,今天顺便抽点时间更新一下这个NIST软件的下载及使用。我们首先讲一下该软件的下载:1.我们直接取NIST的官网(https://csrc.nist.gov/)下载即可 ;链接如下:下载...

Miracle.Zhao的博客 3万+

《操作系统实验》C++实现生产者-消费者问题

生产者-消费者问题1 实验内容及要求2 实验环境3 实验设计3.1 问题描述3.2 基本思想3.2.1 生产者线程3.2.2 消费者线程3.2.3 同步的实现3.3 数据结构4 实验源码5 实验总结 1 实验内容及要求 1、模拟生产者—消费者问题; 2、程序要添加适当的注释,程序的书写要采用缩进格式; 3、程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应; 4、程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。 2 实验环境 windows 10,Visual Studi

weixin_44197749的博客 1万+

实战解析:利用Python requests库高效抓取京东商品评论并构建结构化数据集

本文详细介绍了如何利用Python requests库高效抓取京东商品评论并构建结构化数据集。通过分析京东评论接口、处理反爬机制以及数据解析存储,帮助开发者快速获取电商数据,适用于竞品监控、用户画像构建等商业场景。

weixin_42526415的博客 838

STM32(H7)学习记录-14 XSPI连接DDR SDRAM(HyperBus)

主控芯片是STM32H7S7 ,HyperBusRAM芯片是W956D8MBYA5I。*DQS0(这个引脚是作为RWDS)使用的CubeMX版本是6.13.0。

m0_71918616的博客 1074

兔子吃草同步算法c++|操作系统

这是一个兔子吃草同步算法的c++程序,如果对其中函数有不理解的可以看我另一篇博客进程相关函数汇总解释,对照着看,可能方便你理解、 过程图: #include<Windows.h> #include<stdio.h> #include<stdlib.h> #include<time.h> /*信号量的定义,它是负责协调各个线程,以保证它们能够正确、合理的使用公共资源,用于控制进程间的同步或互斥*/ typedef HANDLE Semaphore; Sem.

LLLLQZ的博客 767

AutoSAR配置视频讲解:新建DaVinci工程

AutoSAR实验视频讲解:闪烁一颗LED实验【新建DaVinci工程】 上一篇 | 下一篇 | 总目录 实验架构图 视频本频放在了文末,下图描述了本次实验配置内容在AutoSAR架构中的位置,供大家参考 实验内容 本节课程讲解新建DaVinci工程,听上去新建工程很简单,但是还是需要很多的准备工作和细节。主要内容是新建工程和导入dbc文件和导入arxml文件的方法 主要步骤 新建DaVinci工程 导入.dbc通信矩阵文件 导入Mcal的arxml文件 实验视频2:Mcal配置 提示:版权所在,违

雪云飞星的博客 6276

【C++|Linux系统编程】互斥锁、条件变量、信号量、自旋锁、读写锁

2)第二种锁,例如火车上的厕所,它是公共的,空闲的时候任何人可以进入,人进去以后就会把它锁起来,其它的人如果要上厕所,必须等待解锁,即里面的人出来。多线程可以共享资源(变量和对象),对编程带来了方便,但是某些对象虽然可以共享,但在同一个时间只能由一个线程使用,多个线程同时使用会产生冲突,例如socket连接,数据库连接池。对多线程来说,资源是共享的,基本上不存在不允许访问的情况,但是,共享的资源在某一时间点只能有一个线程占用,所以需要给资源加锁。不是,是锁共享资源,线程给共享资源加的锁。

千禧皓月的博客 312

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

基于c++实现的简易线程池(固定大小、动态大小、任意参数任务)

该线程池只是一个简单的线程池模型,只是为了将c++11的多线程编程技术进行应用实战,仅涉及到c++11的多线程编程技术和生产者消费者模型,任务队列和线程池的管理并没有实现。

qq_58158950的博客 514

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

操作系统实验:windows下C++实现生产者/消费者问题

生产者/消费者问题 #include <windows.h> #include <iostream> const unsigned short SIZE_OF_BUFFER = 2; //缓冲区长度 unsigned short ProductID = 0; //产品号 unsigned short ConsumeID = 0; //将被消耗的产品号 unsigned short in = 0; //产品

qq_45811908的博客 2358

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

操作系统:用c++模拟生产者消费者问题

操作系统:用c++模拟生产者消费者问题 一.实验目的:通过实验模拟生产者与消费者之间的关系,了解并掌握他们之间的关系及其原理。由此增加对进程同步的问题的了解。 二.实验要求:每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程类型标号、进程系统号、进程状态、进程产品(字符)、进程链指针等等。系统开辟了一个缓冲区,大小由buffersize指定。程序中有三个链队列,一个链表。一个就绪队列(ready)。两个等待队列:生产者等待队列(producer),消费者等待队(consumer)。一个

m0_47995646的博客 1872

生产者与消费者问题C语言实现

实验目的 ①实现生产者—消费者问题的模拟,以便更好的理解此经典进程同步问题。生产者-消费者问题是典型的PV操作问题,假设系统中有一个比较大的缓冲池,生产者的任务是只要缓冲池未满就可以将生产出的产品放入其中,而消费者的任务是只要缓冲池未空就可以从缓冲池中拿走产品。缓冲池被占用时,任何进程都不能访问。 ②每一个生产者都要把自己生产的产品放入缓冲池,每个消费者从缓冲池中取走产品消费。在这种情况下,生...

徐奕的专栏 11万+

C语言实现 操作系统 经典的进程同步问题(1)

(2)在C语言中,使用AND型信号量(也称为“复合信号量”或“多信号量同步”)直接实现可能不是最直观的方法,因为标准的POSIX线程库(pthread)并不直接支持AND型信号量。但在这个场景中,主要关心的是缓冲区的空和满状态,这通常可以通过两个独立的信号量(一个表示空槽位,另一个表示有数据的槽位)来实现。不过,为了说明如何模拟AND型信号量的概念,可以考虑一个场景,其中生产者在继续生产之前需要等待两个条件:缓冲区未满,且另一个特定的条件(比如一个“允许生产”的信号量)也满足。生产者在生产物品前先等待。

2301_79046256的博客 1869

进程同步生产者-消费者问题C语言,经典进程同步问题 --- 生产者和消费者

问题描述:一组生产者进程和一组消费者进程共享一个初始为空、大小为 n 的缓冲区,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。由于缓冲区是临界资源,它只允许一个生产者放入消息,或者一个消费者从中取出消息。分析:关系分析:生产者和消费者对缓冲区互斥访问是互斥关系,同时生产者和消费者又是一个相互协作的关系,只有生产者生产之后,消费...

weixin_36440319的博客 3673

【C语言游戏开发】初级贪吃蛇

[C语言]初级贪吃蛇

m0_73223545的博客 379

生产者消费者模型的同步与互斥:C++代码实现

在多线程编程中,生产者消费者模型是一种经典的设计模式,用于解决生产者和消费者之间的协作与资源共享问题。本文将深入探讨生产者消费者模型的基本概念和核心思想,以及其在实际应用中的优点和使用场景。特别地,我们将聚焦于消费者和生产者之间的同步与互斥控制策略,比较常见的两种实现方式:环形队列和阻塞队列。 首先,我们会介绍生产者消费者模型的基础概念,探讨其背后的核心设计思想和关键组成部分。随后,详细分析不同实现方式中的同步和互斥机制,比较使用信号量与互斥锁的环形队列

无敌岩雀的博客 1801

flappy bird c语言实现

else if ((j == bar1_y) && ((i < bar1_xTop) || (i > bar1_xDown))) //输出障碍物。if ((i == bird_x) && (j == bird_y)) //输出小鸟。void gotoxy(int x, int y) //将光标调整到(x,y)的位置。//将光标调整到(0,0)的位置。int updateWithoutInput()//与用户无关的更新。void updateWithInput()//与用户输入有关的更新。

monkeydonotcode的博客 515

生产者消费者的进程同步——1对1,N对1,N对M —— C语言

1、1个生产者和1个消费者 /* ***1个生产者和1个消费者*** */ #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <sys/types.h> #include <semaphore.h> #include <time.h> int n=10; int buffer[10]; in

demo_yo的博客 2279

生产者-消费者问题及C语言实现

问题描述 生产者-消费者问题是最著名的进程同步问题。它描述了一组生产者与一组消费者,它们共享一个有界缓冲池,生产者向池中投入产品,消费者从池中取得产品。假定缓冲池中有 N 个缓冲区,每个缓冲区只能存放一个类型为 item 的产品,而所有的生产者和消费者是相互等效的,则需要为该问题设置三个信号量:互斥信号量 mutex,用于实现对缓冲池的互斥访问,其初值为 1;资源信号量 empty,用来表示

小弹弹的专栏 1万+

C语言光标移动函数

 static void _SetPos(int x, int y)//移动光标到X、Y位置 { COORD position; HANDLE handle; handle=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(handle, position); }C语言光标移动函数,COORD实际上是一个C语言内部做好的结构体,结构...

Hanani_Jia的博客 2万+
上一篇: 理发师问题c++|操作系统
下一篇: 兔子吃草同步算法c++|操作系统
LLLLQZ
博客等级 码龄7年 308粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值