📄 zxj.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 + -