📄 临界资源手动1.cpp
字号:
#include<iostream.h>
#include<stdlib.h>
int s=1;////////////临界资源数为1
typedef struct qnode/////s 信号量结点
{
int data,qu;////////data用于保存正在等待资源的进程,qu保存正在使用临界资源的进程.
struct qnode * next;
}* queues;
typedef struct/////S信号量队列
{
queues front;////队头指针
queues rear;///队尾指针
}lqueue;
lqueue sq;////////队列sq
void initq(lqueue &s)//////构造信号量队列S
{
s.front =s.rear=(queues)malloc(sizeof(qnode));
s.front->next=NULL;
}
void enqueue(int e)/////////////如果资源忙,则插入队尾
{
queues p;
p=(queues)malloc(sizeof(qnode));
p->data=e;
p->next=NULL;
sq.rear->next=p;
sq.rear=p;
}
void dequeue()//,int e)//////////////////删除队头
{
queues p;
p=sq.front->next;
sq.front->next=p->next;
free(p);
}
void p()//////////////////p操作
{s=s-1;}
void v()//////////////////v操作
{s=s+1;}
void inmanager(int,int);
void outmanager();
void main()
{
initq(sq);////////构造信号量队列
char ch; ////////控制循环
int m=0;
while(ch!='q'&&ch!='Q')
{
cout<<"************************************"<<endl;
cout<<"临界资源占有者:";
if(s==1)
cout<<"资源空闲!"<<endl;
else
cout<<"进程"<<sq.front->qu<<endl;
cout<<"************************************"<<endl;
cout<<"进入临界区(I) 退出临界区(e) 退出(Q)"<<endl<<endl;
cin>>ch;
if(ch=='i'||ch=='I')
{
m++;//////////////////进程序号
p();///////////////////p操作
inmanager(m,0);
}
if(ch=='e'||ch=='E')
{
if(s<1)////////////////////临界资源被占用,则可以调用退出函数
outmanager();
if(sq.front->next!=NULL)
dequeue();///////////////队头元素进入临界资源,删除队头元素
}
}
}
void inmanager(int m,int n)
{
cout<<"进程"<<m<<"请求进入临界区......"<<endl;
if(s>=0||n==1)///////////有资源
{
cout<<"准许进入!"<<endl;
cout<<"进程"<<m<<"正在临界区......."<<endl;
sq.front->qu=m;///////////记录在临界区的进程号
}
else
{
cout<<"资源忙,请等待!"<<endl;
if(sq.front->next==NULL)
sq.rear=sq.front;
enqueue(m);///////////进入信号量队列
}
cout<<endl<<endl;
}
void outmanager()
{
cout<<"进程"<<sq.front->qu<<"请求退出临界区......"<<endl;
v();
cout<<"准许退出!"<<endl;
cout<<"进程"<<sq.front->qu<<"退出临界区......."<<endl<<endl;
if(s<=0)//////////////////资源空闲
inmanager(sq.front->next->data,1);//////////信号量队列队头元素请求进入临界资源
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -