资源简介
① 实现UP、DOWN原语
② 产生3个进程,两个进程模拟需要进入临界区的用户进程。
当需要进入临界区时,显示:“进程x请求进入临界区…”,同时向管理进程提出申请;
申请返回,表示进入了临界区。在临界区中等待一段随机时间,并显示:“进程x正在临界区…”;
当时间结束,显示:“进程x退出临界区…”,同时向管理进程提出退出申请;
当申请返回,显示:“进程x已退出临界区。”
③ 一个进程作为原语的管理进程,接受其他进程的临界区进入请求:
如果允许进入,则根据DOWN 原语的操作步骤设置相应变量,然后返回;
如果不允许进入,则进入循环等待,直到允许为止;
退出时模拟UP 操作。
④ 进程间通信
代码片段和文件信息
#include
#include
#include
#include
#include
DWORD WINAPI Th1Proc(LPVOID lpParameter); //声明进程1
DWORD WINAPI Th2Proc(LPVOID lpParameter); //声明进程2
DWORD WINAPI Th3Proc(LPVOID lpParameter); //声明进程3
DWORD WINAPI th3manager(LPVOID lpParameter);//声明管理进程
void getbiandan_1();
void getbiandan_2();
void gettongzi_1();
void gettongzi_2();
void getbiandan_3();
void gettongzi_3();
void display();
int biandan=2;
int tongzi=3;
int flag_t3=0;//声明定义flag变量,防止出现死锁
int flag_t2=0;
int flag_t1=0;
int flag_b3=0;
int flag_b2=0;
int flag_b1=0;
int a[4][2]={{00}{00}{00}{biandantongzi}};
int b[2];
void main()
{
HANDLE hThread1;
HANDLE hThread2;
HANDLE hThread3;
HANDLE Manager;
hThread1=CreateThread(NULL0Th1ProcNULL0NULL);
hThread2=CreateThread(NULL0Th2ProcNULL0NULL);
hThread3=CreateThread(NULL0Th3ProcNULL0NULL);
Manager=CreateThread(NULL0th3managerNULL0NULL);
srand( (unsigned)time( NULL ) );
Sleep(10000);
}
DWORD WINAPI Th2Proc(LPVOID lpParameter)
{
while(TRUE) //进程2:生成一个随机数,判断扁担与桶子的优先取得
{
for(int i=0;i<2;i++)
{
b[i]=rand();
}
if(b[0]>=b[1])
{
if(a[1][0]<1)
{
getbiandan_2();
// display();
}
else
{
Sleep(150);
}
}
else
{
if(a[1][1]<2)
{
gettongzi_2();
// display();
}
else
{
Sleep(150);
}
}
}
}
DWORD WINAPI Th3Proc(LPVOID lpParameter) //进程3:生成一个随机数,判断扁担与桶子的优先取得
{
while(TRUE)
{
for(int j=0;j<2;j++)
{
b[j]=rand();
}
if(b[0]>=b[1])
{
if(a[2][0]<1)
{
getbiandan_3();
// display();
}
else
{
Sleep(150);
}
}
else
{
if(a[2][1]<2)
{
gettongzi_3();
//display();
}
else
{
Sleep(150);
}
}
}
}
DWORD WINAPI Th1Proc(LPVOID lpParameter)//进程1:生成一个随机数,判断扁担与桶子的优先取得
{
while(TRUE)
{
for(int k=0;k<2;k++)
{
b[k]=rand();
}
if(b[0]>=b[1])
{
if(a[0][0]<1)
{
getbiandan_1();
// display();
}
else
{
Sleep(150);
}
}
else
{
if(a[0][1]<2)
{
gettongzi_1();
//display();
}
else
{
Sleep(150);
}
}
}
}
DWORD WINAPI th3manager(LPVOID lpParameter)//管理进程:定义i变量,当i=0时,进程1为和尚甲;
{ //当i=1时,进程2为和尚乙;
while(TRUE) //当i=2时,进程3为和尚丙;
{
for(int i=0;i<3;i++)
{
if(a[i][0]==1&&a[i][1]==2)
{
if(i==0)
{
cout<<“和尚甲正在挑水....“< a[0][0]=0;
a[0][1]=0;
a[3][0]++;
a[3][1]+=2;
cout<<“和尚甲挑水完毕,还回工具,休息片刻,继续挑水。。。“< display();
// Sleep(1000);
}
if(i==1)
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 6618 2010-03-21 17:58 200717030221欧阳佳\ouyang.cpp
文件 138240 2010-03-22 11:21 200717030221欧阳佳\200717030221欧阳佳.doc
目录 0 2010-03-22 14:57 200717030221欧阳佳
----------- --------- ---------- ----- ----
144858 3
评论
共有 条评论