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

问题解决:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(计算到第20个月) 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(计算到第20个月) 兔子的规律为数列1,1,2,3,5,8,13,21…*/ #include<stdio.h> #include<string.h> #define SIZE 21 void way() { //1 1 2 3 5 8 13 int str[SIZE]; for (int i = 1; i <SIZE; i+ 阅读详情

这是一个兔子吃草同步算法的c++程序,如果对其中函数有不理解的可以看我另一篇博客进程相关函数汇总解释,对照着看,可能方便你理解、

过程图:
在这里插入图片描述

#include<Windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/*信号量的定义,它是负责协调各个线程,以保证它们能够正确、合理的使用公共资源,用于控制进程间的同步或互斥*/
typedef HANDLE Semaphore;
Semaphore g_semBuffer, g_semGlass, g_mutex;//mutex为互斥锁
//利用Windows下的API函数(视窗操作系统应用程序接口)来定义P、V操作
#define P(S) WaitForSingleObject(S,INFINITE)
#define V(S) ReleaseSemaphore(S,1,NULL)
#define rate 100
#define CONSUMER_NUM 4 //消费者个数
#define PRODUCER_NUM 4 //生产者个数
#define BUFFER_NUM   4 //缓冲区个数

char *thing[4] = { "glass1","glass2","glass3","glass4" };


//公共的队列缓冲区
struct Buffer
{
	int product[BUFFER_NUM];
	int front, rear;
}g_buf;

//兔子进程
DWORD WINAPI Rabbit(LPVOID para)
{
	srand((unsigned)time(NULL));
	int i = *(int*)para;	//第i只小白兔
	int ptr;				//兔子待吃的草的指针
	Sleep(1800);
	while (1)
	{
		printf("%03d 小白兔:我饿了......!\n",i);
		P(g_semGlass);
		P(g_mutex);
		ptr = g_buf.front;	//记录草在缓冲队列中的位置
		g_buf.front = (g_buf.front + 1) % BUFFER_NUM;
		V(g_mutex);
		Sleep(rate*rand()%10+1800);
		printf("%03d 小白兔:我吃了 buf[%d]=%s的草\n",i,ptr,thing[g_buf.product[ptr]]);
		V(g_semBuffer);
	}
	return 0;
}

DWORD WINAPI Grassplot(LPVOID para)
{
	int i = *(int*)para - CONSUMER_NUM;
	int ptr;
	int data;//产品
	Sleep(1800);
	printf("%03d 小草:小白兔快来找我!\n",i);
	srand((unsigned)time(NULL));//让每次生成随机数不同,只使用rand会让每次的随机都是一样的

	while (1)
	{
		Sleep(rate * rand() % 10 + 1800);
		data = rand() % 4;	//产生0到4间的整数
		printf("%03d 小草:我要长大!data=%s!\n",i,thing[data]);
		P(g_semBuffer);
		P(g_mutex);
		ptr = g_buf.rear;	//记录消费的物品
		g_buf.rear = (g_buf.rear + 1) % BUFFER_NUM;//入队
		V(g_mutex);
		g_buf.product[ptr] = data;
		Sleep(rate / 2 * rand() % 10 + 1800);
		printf("%03d 小草:我长大了!草放在buf[%d]=%s中,小白兔快来吃我!\n",i,ptr,thing[g_buf.product[ptr]]);
		V(g_semGlass);
	}
	return 0;
}

int main()
{
	HANDLE hThread[CONSUMER_NUM + PRODUCER_NUM];//线程计数
	int totalThreads = CONSUMER_NUM + PRODUCER_NUM;
	DWORD tid;
	int i = 0;
	//初始化信号量
	g_mutex = CreateSemaphore(NULL,BUFFER_NUM,BUFFER_NUM,TEXT("mutexOfConsumerAndProducer"));
	g_semBuffer = CreateSemaphore(NULL,BUFFER_NUM,BUFFER_NUM,TEXT("BufferSemaphone"));
	g_semGlass = CreateSemaphore(NULL, 0, BUFFER_NUM, TEXT("ProductSemaphone"));
	if (!g_semBuffer||!g_semGlass||!g_mutex)
	{
		printf("Create Semaphone Error!\n");
		return -1;
	}

	//开启兔子的进程
	printf("先请小白兔就位!\n");
	for (i=0;i<CONSUMER_NUM;i++)
	{
		hThread[i] = CreateThread(NULL,0,Rabbit,&i,0,&tid);
		if (hThread[i])
		{
			WaitForSingleObject(hThread[i], 100);
		}
	}

	//开启草地进程
	printf("请小草就位!\n");
	for (; i<totalThreads; i++)
	{
		hThread[i] = CreateThread(NULL,0,Grassplot,&i,0,&tid);
		if (hThread[i])
		{
			WaitForSingleObject(hThread[i],100);
		}
	}

	//兔子线程和草地进程互斥的执行
	WaitForMultipleObjects(totalThreads, hThread,TRUE, INFINITE);
	return 0;
}
题解:洛谷 P4956 [COCI 2017/2018 #6] Davor 等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。在征服南极之后,Davor 开始了一项新的挑战。下一步是在西伯利亚、格林兰、挪威的北极圈远征。日开始出发,在这之前需要一共筹集。他打算在每个星期一筹集。为多少时,能刚好筹集。本文分享的必刷题目是从。如果有多个答案,输出。#普及-# #模拟# 阅读详情

相关推荐

操作系统的兔子吃草问题

计算机系统中的每个线程都可以消费或生产某类资源,当系统中某一线程使用某一资源时, 可以看作是对系统资源的消耗,该进程类似于本问题中的兔子类型的线程(简称:兔子线程)。 而当某个线程结束,释放资源时,则它就类似于本问题中的草地类型的线程(简称:草地线程)。 本实验通过一个有界缓冲区把兔子线程和草地线程联系起来。我们假定兔子线程和草地线程 是相互平等的,即:只要缓冲区未满,草地线程就可以将产生的草送入缓冲区;类似地,只要缓 冲区未空,兔子线程就可以从缓冲区中取走草并消费它。 兔子线程和草地线程的同步关系将禁止草地线程向满的缓冲区输送产品,也禁止兔子线程从 空的缓冲区中提取物品,这两种操作都是禁止的。线程间的互斥关系将禁止同一类型的几个的线 程不能给同时访问同一个缓冲区,即不能对同一个资源进行操作;兔子线程在从缓冲区中拿草的 时候,不允许草地线程同时往缓冲区内放草。

有一只最多能装2只兔子的铁笼子,猎人仅能向笼子中放入兔子(每次只能放入一只),若笼子时满的,则猎人必须等待;饭店老板仅能从笼子中取兔子(每次只能取出一只),若笼子时空的则他也必须等待。假·····

有一只最多能装2只兔子的铁笼子,猎人仅能向笼子中放入兔子(每次只能放入一只),若笼子时满的,则猎人必须等待;饭店老板仅能从笼子中取兔子(每次只能取出一只),若笼子时空的则他也必须等待。假设初始时笼子时空的。定义信号量并初始化,使用P、V操作模拟猎人和饭店老板进程之间的同步与互斥。 Semaphore x = 0; //这里的x代表笼子中兔子的数量 Semaphore y = 2; /...

qq_29762001的博客 4146

兔子源代码

使用C语言绘制3维兔子 计算机图形学作业

STL priority_queue:懒羊羊吃草

这道题的话只要一直排序找出里面最小的就行了 【参考代码】 #include<bits/stdc++.h> using namespace std; int a[1000001]; int main() { int n,x=0; cin>>n; for(int i=1; i<=n; i++) { char s; cin>>s; if(s=='i') { int s; cin>>s; a[++x]=s; } ..

absWC的博客 993

告别手动复制粘贴!用R语言脚本批量抓取TCMSP中药靶点基因(附完整代码)

本文介绍如何使用R语言脚本自动化抓取TCMSP数据库中的中药靶点基因数据,告别手动复制粘贴的低效操作。通过详细的代码示例和参数设置,帮助研究人员快速获取并过滤符合药代动力学标准的中药成分及其靶点基因,大幅提升研究效率。特别适合生物信息学和中药现代化研究领域的从业者。

weixin_26950847的博客 266

Nacos2.3.0与vastBase数据库的集成实践指南

本文详细介绍了将Nacos 2.3.0的默认数据库从MySQL迁移至vastBase数据库的完整实践指南。内容涵盖前期环境准备、源码改造、依赖配置、SQL适配、数据库初始化以及最终的编译打包与部署验证,旨在帮助开发者在国产化或特定技术栈场景下,实现微服务配置中心与vastBase数据库的自主可控集成。

plant的博客 275

懒羊羊求援【优先队列】

题目描述 狼族来进攻羊村了。喜羊羊开始布置防御。但为了更好地抵制住进攻,他们需要一个人去其他羊村求援。这个光荣而艰巨的任务就交给了懒羊羊。路途好遥远,懒羊羊必须吃足够的草才能跑。他吃一两草能跑一公里路。但饿了就跑不动了。不过懒羊羊肚子大着,有多少青草他都能吃。但懒羊羊吃草很花时间,所以希望尽量少吃几次。路上有N个卖草的地方,你帮忙算下懒羊羊吃几次可以到达终点。 输入 第一行有一个 N ,表示路上有 N 个卖草的地方;(1<=N<=10000)(1<=N<=10000)(1<=N

算法小猪的博客 490

渗透测试自学日志之漏洞复现篇:漏洞列表

复现成功的漏洞列表,有复现方式,各位可以参考。 网络安全,人人有责,使用本文进行非法活动,与本人无关

maverickpig的博客 2176

[NOI2011]兔兔与蛋蛋游戏

传送门 直接博弈论dfs可以得到75分(然鹅我博弈论学的很pie) #include<bits/stdc++.h> #define LL long long #define INF 10000 using namespace std; int read() { int x=0,f=1;char s=getchar(); while(s...

weixin_30435261的博客 150

Unity集成阿里云语音AI:从麦克风录音到实时语音合成的全流程实现

本文详细介绍了在Unity中集成阿里云语音AI服务,实现从麦克风录音到实时语音合成的完整流程。通过调用阿里云的语音转文字和文字转语音接口,开发者可以快速为游戏或应用添加语音交互功能,提升用户体验。文章涵盖了环境配置、签名认证、音频处理及项目集成等核心步骤,并提供了实用的调试技巧。

weixin_29224589的博客 324

2024最新版Anaconda Navigator安装使用指南

本文简要介绍如何下载安装Anaconda Navigator最新版,以及如何使用Python内核搭载来完成应用程序开发。

jackson_lingua的博客 1万+

C++ 兔子算法(在visual studio已亲测,无任何问题。)

求Fibonacci数列前40个数。这个数列有如下特点:第1、2个数为1、1。从第3个数开始,每个数是其前面两个数之和。即 F1=1(n=1) F2=1(n=2) Fn=Fn-1+Fn-2(n≥3) // ConsoleApplication4.cpp : Defines the entry point for the console a...

18妹的小窝 790

Mac微信聊天记录备份终极指南:用软链接轻松迁移到外接硬盘(附重签名教程)

本文详细介绍了如何通过软链接技术将Mac微信聊天记录备份迁移到外接硬盘,解决内置存储空间不足的问题。教程包括备份文件定位、软链接创建及微信重签名步骤,帮助用户高效管理微信数据,释放Mac存储空间。

uuu88的博客 1166

C++递推算法求解兔子产仔问题

【题目】 【算法描述】 【源代码】 [cpp] view plain copy print?#include <stdio.h>  #include <stdlib.h>    int Fibonacci(int n)//兔子产仔算法  {      int t1, t2;      if (n==1||n==2)      {          return 1;      }      else

Zhoujy1996的博客 5993

零基础学习simulink-- 基于自适应模糊PID控制的直流电机速度控制系统

通过上述代码实现,您可以逐步创建和搭建一个基于自适应模糊PID控制的直流电机速度控制系统。该系统能够根据电机的状态和误差实时调整PID参数,确保电机速度稳定在设定范围内。自适应模糊PID控制具有较强的鲁棒性和适应性,能够在存在不确定性和扰动的情况下提供快速且精确的控制性能。Simulink提供了强大的建模和仿真工具,使得控制系统工程师能够快速构建复杂的控制算法,并将其应用于实际工程中。直流电机建模:建立直流电机的动态模型,包括电枢电压、电流、转速和负载扭矩。自适应模糊PID控制器设计。

amy_mhd的博客 413

2025华为OD面试手撕代码真题目录、八股文真题目录以及面试技巧

1. **华为OD面试技术面准备指南** 2. **华为OD面试技术面常见问题解答** 3. **华为OD面试技术面经验分享** 4. **华为OD面试技术面注意事项** 5. **华为OD面试技术面攻略** 6. **华为OD面试技术面模拟题目与解析** 7. **华为OD面试技术面知识点梳理** 8. **华为OD面试技术面常考**

算法大师! 3万+

【高精度算法&递归算法】兔子繁殖加强版(c++)

题目描述 兔子具有很强的繁殖能力。一对成年兔子每个月可以繁殖一对小兔子,而一对小兔子经过m个月之后,就会长成一对成年兔子。当一开始有一对成年兔子时,经过d个月以后,共有多少对兔子?你的任务是计算出一堆成年兔子经过d个月之后,共有多少对兔子?可以假定,在此阶段没有任何兔子死亡。 输入 输入包括多组测试数据。每组测试数据的一行中包括2个整数m(1<=m<=10),d(1<=d<...

icehomegre的博客 3148

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

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

C ++ 经典 兔子问题

第一种方法: #include <iostream> using namespace std; int getSum(int n); int main() { int n; cin >> n; cout << getSum(n) << endl; //输出结果 return 0; } int getSum(int n) { if(n == 1 || n == 2) //n=1或2跳出递归 ...

qq_62475378的博客 1082

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

问题 G: 懒羊羊吃草

题目描述 众所周知,懒羊羊是所有小羊里最贪吃的一只。然而,鲜为人知的是,懒羊羊也有存储粮食的习惯。而更让大家吃惊的事实是,我们的懒羊羊做事很有条理,每当他存储一份粮食时,他会专门拿出一个筐来存放。因此,他的仓库里有很多很多筐的青草。而我们的懒羊羊又是一个经常馋嘴的小羊,每当他想吃草时,就会从仓库里找出数量最少的一筐草,把它吃掉。可是懒羊羊因为草吃得太多了导致大脑运转缓慢,所以他不得不向你请求支援,帮他找出他应该吃数量为多少的青草。 输入 第一行为一个正整数n,表示懒羊羊一共进行了n次操作(2<=n&l

qq_52273733的博客 2889

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java古典兔子问题c语言,Java递归算法经典实例(经典兔子问题)

Java递归算法经典实例(经典兔子问题)题目:古典问题:3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?分析:首先我们要明白题目的意思指的是每个月的兔子总对数;假设将兔子分为小中大三种,兔子从出生后三个月后每个月就会生出一对兔子,那么我们假定第一个月的兔子为小兔子,第二个月为中兔子,第三个月之后就为大兔子,那么第一个月分别有1、0、0,...

weixin_39524147的博客 528

java兔子问题流程图_C语言编程狼追兔子问题代码解析

问题描述一只兔子躲进了10个环形分布的洞中的一个。狼在第一个洞中没有找到兔子,就隔一个洞,到第3个洞去找;也没有找到,就隔2个洞,到第6个洞去找;以后每次多一个洞去找兔子……这样下去,如果一直找不到兔子,请问兔子可能在哪个洞中?问题分析首先定义一个数组a[11],其数组元素为a[1],a[2],a[3]……a[10],这10个数组元素分别表示10个洞,初值均置为1。接着使用“穷举法”来找兔子,通过...

weixin_35748962的博客 558

兔子吃萝卜的c语言编程,狼追兔子的c语言实现

满意答案16guoyuming2013.03.05采纳率:49%等级:13已帮助:8005人用单链表实现#include #includetypedef struct node{int cave;struct node * next;}node,*LinkList;void main(){int i=0,j,count=1; // 初始值为1;LinkList L,p,h;//也可node...

weixin_36083434的博客 1056

C++兔子问题

C++兔子问题 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月    后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21… #include <iostream> //古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月 //后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.

qq_48204413的博客 3826
上一篇: 生产者消费者同步问题c++|操作系统
下一篇: 哲学家进餐c++|操作系统
LLLLQZ
博客等级 码龄7年 308粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值