baber main thread barber thread

来源:互联网 发布:自动化控制软件 编辑:程序博客网 时间:2024/06/05 01:08

Console:

#define BARBER_NUM  3

#define BENCH_SIZE 10

#define CUSTOMER_EVENT L"xx"

#define CLOSE_EVENT L"yy"


int g_nBench[BENCH_SIZE];

CRITICAL_SECTION g_cs;


int _tmain(){

int i, nCumstomerID, nBarberID[BARBER_NUM];

HANDLE hBarber[BARBER_NUM], h[2];

DWORD dw=0, dwThreadID=0;

//1 create 3 thread

if ((g_hCustomer=CreateEvent(NULL, FALSE, FALSE, CUMSTOR_EVENT))==0)

  goto errexit;

if ((g_hClose=CreateEvent(NULL, FALSE, FALSE, CUMSTOR_EVENT))==0)

  goto errexit;

InitializeCriticalSection(&g_cs);

memset(g_nBench,0,sizeof(int)*BENCH_SIZE);

if(g_hSemaphore=CreateSemaphore(NULL,0,BENCH_SIZE,NULL)==0)

  goto errexit;

for(i=0; i<BARBER_NUM; I++){

  nBarberID[i]=i+1;

  HBarber[i]=CreateThread(NULL,0,barber,(PVOID)&nBarberID[i],0, &dwThreadId);

  if(hBarber[i]==0)

    goto errexit;

}


//等待CUSTOMER_EVENT 跟 CLOSE_EVENT(while loop)

h[0]=g_hClose;

h[1]=g_hCustomer;

while(1){

  dw=WaitForMultipleObject(2,h,FALSE, INFINITE)

  switch(dw){

    //2.1CLOSE_EVENT

    case WAIT_OBJECT_0+0;

   //2.1.1 g_nBench 清空

   EnterCriticalSection(&g_cs);

   for(i=0; i<BENCH_SIZE; i++){

     if(g_nBench[i]!=0){

      printf("客人[%d]直接离开 因为要关门了\n", g_nBench[i]);

      g_nBench[i]=0;

     }

     LeaveCriticalSection(&g_cs);

    //2.1.2 等待3个barber thread 结束

    WaitForMultipleObjects(BARBER_NUM, hBarber, TRUE ); //TRUE 等全部都结束

    //2.1.3 关门

   printf("关门");

   goto errexit;

   break;


    case WAIT_OBJECT_0+1:

    //2.2CUSTOMER_EVENT

   // customerID++

   nCustomerID++;

  //2.2.1 检查bench 是否还有位置 如果满了 =>让客人直接离开

  if(g_nBench[BENCH_SIZE-1]!=0)

    printf("客人[%d]直接离开, 因为bench满了", nCustomerID);

  //2.2.2 bench还有位置  => 把客人送到bench后面 =>ReleaseSemaphore(+1)

  else{

    EnterCriticalSection(&g_cs);

    for(i=0; i<BENCH_SIZE; i++)

      if(g_nBench[i] ==0)

        break;

     g_nBench[i]=nCustomerID;

      LeaveCriticalSection(&g_cs);

      ReleaseSemaphore("g_hSemaphore",1,NULL);

     printf("客人[%d]来到bechen", nCustomerID);

   break;

   }

}

errexit:

  if(g_hClose){

    CloseHandle(g_hClose);

    g_hClose = 0;

}

if(g_hCustomer){

    CloseHandle(g_hCustomer);

    g_hCustomer = 0;

}

DeleteCriticalSection(&g_cs);

if(g_hSemaphore){

  CloseHandle(g_hSemaphore);

  g_hSemaphore =0;

}

for(i=0;i<BARBER_NUM; i++){

if(hBarber[i]){

  CloseHandle(hBarber[i]);

  hBarber[i ] =0;

}

}

}



DWORD WINAPI barber(PVOID pvParam){


 int nBarberID=0, nCustomerID;

 Handle h[2];

 DWORD dw;

 nBarberID=*((int*)pvParam);

 h[0]=g_hClose;

 h[1]=g_hSemaphore;

//1.等待CLOSE_EVENT 跟SEMAPHORE(while loop) 

while(1){

  dw=WaitForMultipleObject(2,h,FALSE,0);

  if(dw==WAIT_TIMEOUT){

    printf("理发师正在睡觉", nBarberID);

   dw=WaitForMultipleObject(2,h,FALSE,INFINITE);

  }

  

  switch(dw){

    case WAIT_OBJECT_0+0:

    //1.1 CLOSE_EVENT =>Barber下班离开 thread结束

     printf("理发师[%d]可以下班了",nBarberID);

     return 0;

     break;

   

    case WAIT_OBJECT_0+1:

   //1.2 SEMAPHOPRE

   //1.2.1 从bench 拉出第一个人 修改bench

   EnterCriticalSection(&g_cs);

   nCustomerID=g_nBench[0];

   memcpy(&g_nBench[0], &g_nBench[1], sizeof(int)*(BENCH_SIZE-1));

  g_nBench[BENCH_SIZE-1]=0

   LeaveCriticalSection(&g_cs);

  if(nCustomerID==0)

    continue;

   //1.2.2开始剪头发 sleep 4s

   printf("理发师[%d]开始服务客人[%d]\n", nBarberID, nCustomerID);

  Sleep(4000);

  //1.2.3 剪完头发

  printf("理发师[%d]完成客人[%d]的服务\n", nBarberID, nCustomerID);

 




  }




  }

 return 0;

}


原创粉丝点击