当前位置:首页 > 进程之间的同步互斥与通信理发师问题操作系统课程设计说明书(含源程程序)
信息科学与工程学院软件实践实训报告
cout<<\有空位,顾客已坐下\ ::ReleaseSemaphore(customers,1,NULL); //V(customer) ::ResumeThread(customers); //唤醒理发师进程 ::ReleaseMutex(Mutex); //释放互斥量,以便其他线程使用 ::WaitForSingleObject(barbers,INFINITE);//等待理发 gethaircut(); } else { cout<<\没有空椅子,第\个顾客离开理发店\没有椅子,顾客直接离开 ::ReleaseMutex(Mutex); } return 0; }
DWORD WINAPI barber(LPVOID pParm1) //理发师线程 {
while(true) { ::WaitForSingleObject(customers,INFINITE);//p(customers),等待顾客 ::WaitForSingleObject(Mutex,INFINITE); //等待互斥量
waiting--; //等待的人数减1 ::ReleaseSemaphore(barbers,1,NULL); //释放信号量 ::ResumeThread(barbers); //唤醒顾客进程 ::ReleaseMutex(Mutex); //v(mutex); cuthair(); finish++; }
return 0; }
int main(int argc, char* argv[]) //实现线程的操作 {
cout<<\输入理发店中的椅子个数:\ cin>>chairs; cout<<\店中有\把椅子\ //设置椅子数目 cout<<\是否开始接待顾客?Y/N\ //是否开门营业 cin>>open_door; while (open_door!='y') { cout< 9 信息科学与工程学院软件实践实训报告 cin>>open_door; } HANDLE hThread1; HANDLE hThread2; hThread2=::CreateThread (NULL,0,barber,NULL,0,NULL); //产生一个理发师进程 while(close_door!='y') { ::Sleep(random());//函数实现顾客随机到来 hThread1=::CreateThread(NULL,0,customer,NULL,a,NULL); cout< cin>>close_door; return close_door; } } if (close_door=='y') { cout<<\暂停营业!欢迎下次光临!\ return 0; } return 0; } 13. 程序运行 开始 10 信息科学与工程学院软件实践实训报告 输入椅子数目 选择是否接待顾客 接待顾客 11 信息科学与工程学院软件实践实训报告 理发完毕 14. 总结 通过这个课程设计,对于课本上的关于进程之间的同步、互斥有了更深层的认识,而且有了具体上直观上的理解。虽然对于第二个课程设计要求没有达到,但我也学到了许多。进程作为系统的基本的操作单位,其之间的互斥、同步是非常重要的。生产者与消费者这一个问题中,生产者与消费者公用一个缓存区,这就涉及到了两个进程对缓存区的互斥操作,否者将会产生许多不切实际的问题,这也就失去的系统操作的实际意义。而通过一个互斥信号量Mutex便很好的解决了这一个问题,两个进程在操作缓存区之前必须先申请使用,如果信号量表示已有进程正在对缓存区进行操作则必须等待其完成方可。在做这个设计的时候也遇到了许多问题,例如信号量的设置。由于这个问题中不仅涉及到理发师与顾客之间的互斥同步问题,还设计到各个顾客进程之间的互斥同步问题,所以起初信号量设置不足而导致问题出错。 总的来讲,此次课程设计对我们操作系统知识的巩固起了重要作用,让我们受到了很多启发,懂得了怎样更好的去学习操作系统课程。操作系统不在是一个模糊的概念存在,许多实际的例子,问题都能涉及到操作系统方面的知识。这也看出了操作系统对于整个计算机学科的重要性,他不单单作为一个学科存在,而是渗透到各个学科中,作为各个学科的基础甚至提升。虽然本次的设计不够完善,但我觉得自己获得的东西远远超过这个设计的内容。 12
共分享92篇相关文档