[关闭]
@mynameiszhangxu 2015-12-17T02:39:43.000000Z 字数 2153 阅读 1265

操作系统实验

操作系统


实验题目

进程同步和互斥模拟实验

实验目的

  • 熟悉进程同步的概念
  • 深刻理解死锁的概念
  • 深刻理解临界区、互斥的概念

实验内容

模司机售票员线程同步过程。
1. 利用临界区实现线程同步;
2. 模拟线程死锁

实验原理

Created with Raphaël 2.1.2司机进程正常行驶到站、停车占有临时区离开车站释放临时区,激活售票员进程yesno
Created with Raphaël 2.1.2售票员进程售票占有临时区开车门、关车门释放临时区,激活司机进程yesno

实验源码

  1. #include<stdlib.h>
  2. #include<iostream.h> 
  3. #include<stdio.h>
  4. #include<windows.h> 
  5. #include<time.h> 
  6. #define total_num 88   //假设汽车的最大容量为88 #define total_pork 9    //总的站数 
  7. int recent_num=0;      //某一时刻的客车上的人数 int get_on_num;        //上车的人数 int get_off_num;        //下车的人数 int pork=1;              //赋初始值 HANDLE SJ;           //司机的信号量 HANDLE SPY;         //售票员的信号量 
  8. int Get_random(int min, int max)        
  9. //产生一定范围的随机数,可避免下面程序的判断超出客车的最大容量问题  { 
  10.  int a; 
  11.  srand((int)time(0));     while(1) 
  12. { 
  13.   a=rand()%(total_num+1); 
  14.   if(a>=min && a<=max) return a;  } 
  15. } 
  16. //司机的线程 
  17. DWORD WINAPI Thread_Driver(LPVOID Driver) { 
  18.  while(pork<=total_num)  { 
  19.   if(pork==total_pork) 
  20.   { 
  21.    WaitForSingleObject(SJ,INFINITE); 
  22.    cout<<"到达总站,欢迎您下次乘坐**路公交车"<<endl;    cout<<recent_num<<"名乘客到达总站"<<endl;    return 0;   }   else    { 
  23.    ReleaseSemaphore(SPY,1, NULL);    WaitForSingleObject(SJ,INFINITE);    cout<<"汽车启动"<<endl;    cout<<endl; 
  24.  
  25. 3 
  26.   } 
  27.   Sleep(1000);  } 
  28.  return 0; } 
  29. //售票员的线程 
  30. DWORD WINAPI Thread_Conductor(LPVOID SPY) { 
  31.  while(1)  { 
  32.      if(pork<total_pork)   { 
  33.          cout<<"这是第"<<pork<<"站"<<endl;          WaitForSingleObject(SPY,INFINITE);    if(pork==1)    { 
  34.           cout<<"SPY开始售票"<<endl; 
  35.           get_on_num=Get_random(0,total_num-recent_num);            cout<<get_on_num<<"名乘客从该站上车"<<endl; 
  36.      recent_num+=get_on_num; 
  37.             cout<<"共有"<<recent_num<<"名乘客在公交车上"<<endl;    }    else     { 
  38.           cout<<"SJ停好车,乘客开始上下车"<<endl; 
  39.            get_off_num=Get_random(0,recent_num); 
  40.            cout<<get_off_num<<"名乘客在第"<<pork<<"站下车"<<endl;     
  41.    Sleep(1000); 
  42.    recent_num-=get_off_num;    cout<<"SPY开始卖票"<<endl; 
  43.    get_on_num=Get_random(0,total_num-recent_num); 
  44.    cout<<get_on_num<<"名乘客在第"<<pork<<"站上车"<<endl;    recent_num+=get_on_num; 
  45.    cout<<"现在共有"<<recent_num<<"名乘客在车上"<<endl;    } 
  46.       cout<<"此时车上总共有"<<recent_num<<"名乘客在"<<endl;    pork++; 
  47.    ReleaseSemaphore(SJ,1, NULL);  } 
  48.  if(pork==total_pork) 
  49.  { 
  50.   ReleaseSemaphore(SJ,1, NULL); 
  51.   WaitForSingleObject(SPY,INFINITE); 
  52.  4 
  53.   return 0;  } 
  54.  Sleep(1000);  }   
  55.     return 0; } 
  56. //主函数 int main() { 
  57.  HANDLE SJ; 
  58.  HANDLE SPY; 
  59.  SJ=CreateSemaphore(NULL,0,1,"semaphore_driver");  //创建司机的信号量  SPY=CreateSemaphore(NULL,0,1,"semaphore_conductor");  //创建售票员的信号量 
  60.  SJ=CreateThread(NULL,0,Thread_Driver,&SJ,0,NULL); //创建司机的线程  SPY=CreateThread(NULL,0,Thread_Conductor,&SPY,0,NULL);  
  61. //创建售票员的线程 
  62.  CloseHandle(SJ);  CloseHandle(SPY);  while(1); 
  63.  system("pause");  return 0; }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注