• 大小: 58KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-13
  • 语言: 其他
  • 标签: 临界区  

资源简介

① 实现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


评论

共有 条评论

相关资源