P、V操作及进程同步的实现源程序代码

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include "windows.h"

#include "iostream.h"

#include "math.h"

#define random (rand()*10000)/RAND_MAX //定义一个随机函数来产生顾客,并且使个顾客间的时间少于10秒

int long waiting(0); //正在等待的顾客的数目

int chairs; //椅子的总数目

char open_door; //开门

char close_door; //关门

int count(0); //顾客的号码数

int finish(0); //理发完毕的顾客数目

DWORD a;

void cuthair()

{

::Sleep (1000);

cout<<"理发完成 !"<

}

void gethaircut()

{

::Sleep (1001); //顾客被理发的函数,为了和理发师之间有所区别,比理发师理发时间长0.001秒。

cout<<"第"<

}

HANDLE Mutex=::CreateMutex(NULL, FALSE, "Mutex"); //用来实现进程的互斥

HANDLE barbers=::CreateSemaphore(NULL, 1,1, "barbers");//定义信号量来进行线程间的同步

HANDLE customers=::CreateSemaphore(NULL,0,3,"customers");

DWORD WINAPI customer(LPVOID pParm2) //顾客的线程

{

::WaitForSingleObject(Mutex ,INFINITE); //p(mutex)来进行互斥操作

count++; //来的是第几个顾客

cout<<"叮咚!第 "<

//////////////////////

if (waiting

{

if (waiting!=0){

cout<<"此时有"<

}

else

cout<<"没有人在等待"<

waiting++;

cout<<"还有"<

cout<<"有座位,顾客已经坐下"<

::ReleaseSemaphore(customers,1,NULL);//v(customer)

::ResumeThread(customers);//唤醒理发师进程

::ReleaseMutex(Mutex);//释放互斥量,以便其他线程使用

::WaitForSingleObject(barbers,INFINITE);//等待理发

gethaircut(); //理发并离开

}

else

{

cout<<"座位已满,第"<

}

return 0;

}

DWORD WINAPI barber(LPVOID pParm1) //理发师的线程

{

while(true) //一直执行

{

::WaitForSingleObject(customers,INFINITE);//p(customers),等待顾客

::WaitForSingleObject(Mutex,INFINITE); //等待互斥量

waiting--; //等待的人数减一

::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<

cout<<"开门接待顾客吗?Y/N"<

cin>>open_door;

}

//开门接待顾客////////////////////

HANDLE hThread1;

HANDLE hThread2;

hThread2=::CreateThread (NULL,0,barber,NULL,0,NULL); //产生一个理发师进程//顾客到来////////////////////

相关文档
最新文档