-
大小: 85KB文件類型: .rar金幣: 2下載: 0 次發布日期: 2021-05-22
- 語言: C/C++
- 標簽:
資源簡介
操作系統的理發師問題解決文件打包下載(可執行文件,文檔,代碼齊全),C++實現,簡單易學易用。

代碼片段和文件信息
//?babe.cpp?:?Defines?the?entry?point?for?the?console?application.
//
#include?“stdafx.h“
#include?“windows.h“
#include?“iostream.h“
#include?“math.h“
int?long?waiting(0);??????????//等待理發的顧客人數
int??????chairs;??????????????//店中椅子的總數目
char?????open_door;???????????//開門
char?????close_door;??????????//關門
int??????count(0);????????????//顧客的序號
int??????finish(0);???????????//已經理完發的顧客人數
DWORD?a;
HANDLE?Mutex????=::CreateMutex(NULL?FALSE?“Mutex“);??//用來實現進程的互斥??
HANDLE?barbers???=::CreateSemaphore(NULL?11?“barbers“);?//定義信號量來進行線程間的同步
HANDLE?customers?=::CreateSemaphore(NULL03“customers“);?//定義信號量來進行線程間的同步
int?random()
//定義隨機函數來產生顧客,并使兩個顧客間的時間少于15秒
{
????return?(rand()*15000)/RAND_MAX;
}
void?cuthair()
//理發師的理發函數,用時15秒
{?
::Sleep?(15000);
cout<<“理發結束?!“< }
void?gethaircut()
//?顧客被理發的函數
{
::Sleep?(15001);??????????//顧客被理發的函數,為了和理發師之間有所區別,比理發師理發時間長1毫秒
cout<<“第“< }
DWORD?WINAPI?customer(LPVOID?pParm2)
//?顧客線程
{
::WaitForSingleobject(Mutex?INFINITE);??????//P(mutex)來進行互斥操作
count++;?????????????????????????????????????//來的是第幾個顧客
cout<<“顧客敲門!第?“< if?(waiting {
if?(waiting!=0)
{
cout<<“現在有“< }
else
cout<<“無人在等待理發“< waiting++;
cout<<“剩余“< cout<<“有空位,顧客已坐下“< ::ReleaseSemaphore(customers1NULL); //V(customer)
::ResumeThread(customers); //喚醒理發師進程
::ReleaseMutex(Mutex); //釋放互斥量,以便其他線程使用
::WaitForSingleobject(barbersINFINITE);//等待理發
gethaircut(); //理發并離開
}
else
{
cout<<“沒有空椅子,第“< ::ReleaseMutex(Mutex);
}
return?0;
}
DWORD?WINAPI?barber(LPVOID?pParm1)
//理發師線程
{
???while(true)?????????????????????????
???//外循環
???{
::WaitForSingleobject(customersINFINITE);//p(customers),等待顧客
::WaitForSingleobject(MutexINFINITE);???//等待互斥量
????????waiting--;???????????????????????????????//等待的人數減1
::ReleaseSemaphore(barbers1NULL);??????//釋放信號量
::ResumeThread(barbers);?????????????????//喚醒顧客進程
::ReleaseMutex(Mutex);???????????????????//v(mutex);???
cuthair();???????????????????????????????//理發
finish++;????????????????????????????????//理發完畢的顧客數目加1
???}
???return?0;
}
int?main(int?argc?char*?argv[])
//實現線程的操作
{
????cout<<“輸入理發店中的椅子個數:“;
cin>>chairs;
cout<<“店中有“< cout<<“是否開始接待顧客?Y/N“< cin>>open_door;
while?(open_door!=‘y‘)
{
cout< cout<<“是否開始接待顧客?Y/N“< cin>>open_door;
}
HANDLE?hThread1;
HANDLE?hThread2;
hThread2=::CreateThread?(NULL0barberNULL0NULL);?//產生一個理發師進程
while(close_door!=‘y‘)
{?
::Sleep(random());//函數實現顧客隨機到來
hThread1=::CreateThread(NULL0customerNULLaNULL);
cout< if?(finish>=8?&&?waiting==0)
//如果完成數超過8并且沒有人等待
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????192603??2009-12-18?19:19??理發師\babe.exe
?????文件???????3708??2009-12-18?12:57??理發師\babe.cpp
?????文件????????667??2009-12-17?21:54??理發師\StdAfx.h
?????文件????????291??2009-12-17?21:54??理發師\StdAfx.cpp
?????文件?????112128??2010-04-17?09:01??理發師\操作系統文檔.doc
?????目錄??????????0??2009-12-18?19:20??理發師
-----------?---------??----------?-----??----
???????????????309397????????????????????6
- 上一篇:C++11標準發布文檔
- 下一篇:利用MFC實現的停車場模擬仿真程序
評論
共有 條評論