@mynameiszhangxu
2015-12-17T02:39:43.000000Z
字数 2153
阅读 1265
操作系统
进程同步和互斥模拟实验
- 熟悉进程同步的概念
- 深刻理解死锁的概念
- 深刻理解临界区、互斥的概念
模司机售票员线程同步过程。
1. 利用临界区实现线程同步;
2. 模拟线程死锁
#include<stdlib.h>#include<iostream.h>#include<stdio.h>#include<windows.h>#include<time.h>#define total_num 88 //假设汽车的最大容量为88 #define total_pork 9 //总的站数int recent_num=0; //某一时刻的客车上的人数 int get_on_num; //上车的人数 int get_off_num; //下车的人数 int pork=1; //赋初始值 HANDLE SJ; //司机的信号量 HANDLE SPY; //售票员的信号量int Get_random(int min, int max)//产生一定范围的随机数,可避免下面程序的判断超出客车的最大容量问题 {int a;srand((int)time(0)); while(1){a=rand()%(total_num+1);if(a>=min && a<=max) return a; }}//司机的线程DWORD WINAPI Thread_Driver(LPVOID Driver) {while(pork<=total_num) {if(pork==total_pork){WaitForSingleObject(SJ,INFINITE);cout<<"到达总站,欢迎您下次乘坐**路公交车"<<endl; cout<<recent_num<<"名乘客到达总站"<<endl; return 0; } else {ReleaseSemaphore(SPY,1, NULL); WaitForSingleObject(SJ,INFINITE); cout<<"汽车启动"<<endl; cout<<endl;3}Sleep(1000); }return 0; }//售票员的线程DWORD WINAPI Thread_Conductor(LPVOID SPY) {while(1) {if(pork<total_pork) {cout<<"这是第"<<pork<<"站"<<endl; WaitForSingleObject(SPY,INFINITE); if(pork==1) {cout<<"SPY开始售票"<<endl;get_on_num=Get_random(0,total_num-recent_num); cout<<get_on_num<<"名乘客从该站上车"<<endl;recent_num+=get_on_num;cout<<"共有"<<recent_num<<"名乘客在公交车上"<<endl; } else {cout<<"SJ停好车,乘客开始上下车"<<endl;get_off_num=Get_random(0,recent_num);cout<<get_off_num<<"名乘客在第"<<pork<<"站下车"<<endl;Sleep(1000);recent_num-=get_off_num; cout<<"SPY开始卖票"<<endl;get_on_num=Get_random(0,total_num-recent_num);cout<<get_on_num<<"名乘客在第"<<pork<<"站上车"<<endl; recent_num+=get_on_num;cout<<"现在共有"<<recent_num<<"名乘客在车上"<<endl; }cout<<"此时车上总共有"<<recent_num<<"名乘客在"<<endl; pork++;ReleaseSemaphore(SJ,1, NULL); }if(pork==total_pork){ReleaseSemaphore(SJ,1, NULL);WaitForSingleObject(SPY,INFINITE);4return 0; }Sleep(1000); }return 0; }//主函数 int main() {HANDLE SJ;HANDLE SPY;SJ=CreateSemaphore(NULL,0,1,"semaphore_driver"); //创建司机的信号量 SPY=CreateSemaphore(NULL,0,1,"semaphore_conductor"); //创建售票员的信号量SJ=CreateThread(NULL,0,Thread_Driver,&SJ,0,NULL); //创建司机的线程 SPY=CreateThread(NULL,0,Thread_Conductor,&SPY,0,NULL);//创建售票员的线程CloseHandle(SJ); CloseHandle(SPY); while(1);system("pause"); return 0; }