資源簡介
信號量PV經典問題之沉睡理發師,適用操作系統大作業
C++編寫

代碼片段和文件信息
#include
#include
#include
using?namespace?std;
int?waiting=0;
int?chairs=2;?????????????????????????????//為了使結果便于觀測僅采用2個等待椅
#define?random?(rand()*10000)/RAND_MAX????//產生一個隨機數代表顧客在時間上隨機進入理發店
DWORD?a;?
HANDLE?barbers=CreateSemaphore(NULL11“barbers“);
HANDLE?customers=CreateSemaphore(NULL01“customers“);
HANDLE?mutex=CreateMutex(NULLFALSE“mutex“);
//理發師開始為一個顧客理發
void?cut_hair()
{??Sleep(10);
???cout<<“Barber?working.“< ???Sleep(10000);
}
//一個顧客理完發并離開
void?get_haircut()
{???Sleep(10000);
cout<<“One?custmer?finished“<
}
DWORD?WINAPI?ThreadCustomer(LPVOID?lpParam)
{
WaitForSingleobject(mutexINFINITE);
cout<<“One?custmer?enter.“<
if(waiting {
cout<<“Still?have?seats.?waiting.“< waiting++;
????
ReleaseSemaphore(customers1NULL);
ResumeThread(customers);\
????????ReleaseMutex(mutex);
WaitForSingleobject(barbersINFINITE);
cout< get_haircut();
}
else
{
cout<<“Full?the?custmer?left“<
ReleaseMutex(mutex);
}
return?0;
}
DWORD?WINAPI?ThreadBarber(LPVOID?lpParam)
{
while(true)
{
WaitForSingleobject(customersINFINITE);
WaitForSingleobject(mutexINFINITE);
waiting--;
ReleaseSemaphore(barbers1NULL);
???????
ResumeThread(barbers);?
ReleaseMutex(mutex);
cut_hair();
}
return?0;
}
int?main()
{
HANDLE?customerThread;
????HANDLE?barberThread=CreateThread(NULL0ThreadBarberNULL0NULL);
?while(true)
?{??
Sleep(random);
????cout< customerThread=CreateThread(NULL0ThreadCustomerNULLaNULL);
cout< ????
}
return?0;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????249933??2011-12-30?02:07??Task?3.1-Sleeping?Barber\Debug\SleepingBarber.exe
?????文件?????374880??2011-12-30?02:07??Task?3.1-Sleeping?Barber\Debug\SleepingBarber.ilk
?????文件??????54275??2011-12-30?02:07??Task?3.1-Sleeping?Barber\Debug\SleepingBarber.obj
?????文件????5316280??2011-12-30?01:04??Task?3.1-Sleeping?Barber\Debug\SleepingBarber.pch
?????文件????1090560??2011-12-30?02:07??Task?3.1-Sleeping?Barber\Debug\SleepingBarber.pdb
?????文件?????189440??2011-12-30?02:07??Task?3.1-Sleeping?Barber\Debug\vc60.idb
?????文件?????143360??2011-12-30?02:07??Task?3.1-Sleeping?Barber\Debug\vc60.pdb
?????文件???????1743??2011-12-30?02:07??Task?3.1-Sleeping?Barber\SleepingBarber.cpp
?????文件???????3497??2011-12-30?01:28??Task?3.1-Sleeping?Barber\SleepingBarber.dsp
?????文件????????536??2011-12-30?02:08??Task?3.1-Sleeping?Barber\SleepingBarber.dsw
?????文件??????41984??2011-12-30?02:08??Task?3.1-Sleeping?Barber\SleepingBarber.ncb
?????文件??????48640??2011-12-30?02:08??Task?3.1-Sleeping?Barber\SleepingBarber.opt
?????文件????????794??2011-12-30?02:07??Task?3.1-Sleeping?Barber\SleepingBarber.plg
?????目錄??????????0??2011-12-30?02:07??Task?3.1-Sleeping?Barber\Debug
?????目錄??????????0??2011-12-30?02:08??Task?3.1-Sleeping?Barber
-----------?---------??----------?-----??----
??????????????7515922????????????????????15
評論
共有 條評論