⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zxj.h

📁 这是嵌入式系统中关于哲学家吃饭问题的源程序
💻 H
字号:
#include "vxWorks.h"
#include "taskLib.h"
#include "kernelLib.h"
#include "sysLib.h"
#include "logLib.h"
#include "semLib.h"
#include "stdio.h"
#include "stdlib.h"
#define waiting 1                       /*定义哲学家的三种状态:等待,思考和吃饭 */
#define thinking 2
#define eating 3
#define PRIORITY 150                  /*优先级                                */
SEM_ID fork[5];                       /*五支叉子,编号为0,1,2,3,4          */
SEM_ID eat_sem;                      /*计数器信号量                          */
int eat_count;                          /*计数器用于记录吃饭和等待的人数        */
int time_slice;                          /*时间片的长度                          */
int status[5]={0,0,0,0,0};                 /*用于记录每一位哲学家的状态            */
void philosopher(int ID);                 /*五个任务的函数入口                    */


/*主程序                                                                     */
/*创建了5个叉子的信号量,1个计数器信号量。                                 */
/*创建了5个任务,用于处理每一位哲学家的行为。                               */
/*5个任务具有相同的优先级,使用时间片轮转调度方式                           */
/* 时间片长度为1/2秒                                                        */

void go(void)
{
	int i;
	char taskname[13]="philosopher0";
	eat_count=0;
	/* 设置系统的时间片长度 */
	time_slice=sysClkRateGet()/2;
	if(kernelTimeSlice(time_slice)==OK)
	{
		printf("The timeslice is 1/2 seconds.\n");
		printf("-------------------------------------------------\n");
	}
	/* 创建5个叉子2值信号量 */
	for(i=0;i<5;i++)
	{
		fork[i]=semBCreate(SEM_Q_FIFO,SEM_FULL);
	}
	/*计数器信号量*/
	eat_sem=semBCreate(SEM_Q_FIFO,SEM_FULL);
	/* 创建5个philosopher任务*/
	for(i=0;i<5;i++)
	{
		taskname[11]=i+'0';		if(taskSpawn(taskname,PRIORITY,0x100,20000,(FUNCPTR)philosopher,i,0,0,0,0,0,0,0,0,0)==ERROR)
			printf("taskSpawn %s failed\n",taskname);
	}
}

/*模拟五个philosopher的行为                                                    */
/*每一个philosopher有三种状态:吃饭,思考和等待                                */
/*必须先从左边拿起叉子,然后再拿起右边的叉子,才能吃饭                          */
/*入口参数为ID  标志着每一个philosopher的名字                                 */
/*为防止死锁,一个人发现有另外4人正在吃法或等待叉子则进入思考状态             */
void philosopher(int ID)
{
	int think_time,eat_time,aa;
	FOREVER{
		think_time=rand()%4;         /*思考时间是随机的                         */
		printf("***********************************************\n");
		for(aa=0;aa<5;aa++)          /*打印输出每一个哲学家的状态               */
		{
			if(status[aa]==waiting)
				printf("philosopher%d is waiting now.\n",aa);
			else if(status[aa]==thinking)
				printf("philosopher%d is thinking now.\n",aa);
			else if(status[aa]==eating)
				printf("philosopher%d is eating now.\n",aa);
		}
		printf("***********************************************\n");
		if(think_time!=0)
		{
			printf("philosopher%d begins to think and will take %f seconds in thinking.\n",ID,((float)think_time)/2.0); 
			status[ID]=thinking;
			taskDelay(time_slice*think_time);
			printf("philosopher%d ends thinking.\n",ID);
			status[ID]=waiting;
		}
	    /*防止死锁                                                           */
		/*准备吃饭之前先看一下其它吃饭和等待的人数是否为4                    */
		semTake(eat_sem,WAIT_FOREVER);
        /*对不起,你现在还不能eating,还是再thinking一下吧                       */
		if(eat_count>=4)
{
			semGive(eat_sem);
			continue;
		}
/*ok啦,你可以eating了                                                 */
		else
		{
			eat_count++;
			semGive(eat_sem);
		}
		semTake(fork[ID],WAIT_FOREVER);        /*准备拿起左边的叉子          */
		printf("philosopher%d get left fork.\n",ID);
		status[ID]=waiting;
		semTake(fork[(ID+1)%5],WAIT_FOREVER);  /*准备拿起右边的叉子          */
		printf("philosopher%d get right fork.\n",ID);
		printf("philosopher%d begins to eat and will take %f seconds in eating.\n",ID,((float)eat_time)/2.0);
		status[ID]=eating;
		taskDelay(time_slice*eat_time);
		printf("philosopher%d ends eating.\n",ID);
		status[ID]=thinking;                       /*吃完之后转入思考状态        */
		semGive(fork[(ID+1)%5]);
		semGive(fork[ID]);
		semTake(eat_sem,WAIT_FOREVER);
		eat_count--;		                       /*更新eat_count                */
		semGive(eat_sem);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -