自己调试的,最近学OS,感觉还是用调试调试PV操作才踏实! #include "stdafx.h" #include "windows.h" #include "process.h" #include "iostream.h" #define N 5 #define M 10 HANDLE Barber; HANDLE Customers; HANDLE Chairs; HANDLE Mutex; int cstm_count=0; DWORD WINAPI BarberThread(LPVOID lpParameter) { while(1){ WaitForSingleObject(Customers,INFINITE); //printf("Baber cut.../n"); ReleaseSemaphore(Barber,1,NULL); WaitForSingleObject(Mutex,INFINITE); cstm_count--; printf("leave...cutted/n"); ReleaseMutex(Mutex); } return 1; } DWORD WINAPI CustomerThread(LPVOID lpParameter) { int* me=(int *)lpParameter; WaitForSingleObject(Mutex,INFINITE); if(cstm_count==N){ ReleaseMutex(Mutex); printf("%d leave...uncutted/n",*me); return 1; } cstm_count++; printf("%d customer sit...%d/n",*me,cstm_count); ReleaseMutex(Mutex); ReleaseSemaphore(Customers,1,NULL); WaitForSingleObject(Barber,INFINITE); printf("#%d customer cutted.../n",*me); Sleep(1000); return 1; } int main(int argc, char* argv[]) { int cNo[M]; int bNo=0; DWORD dw; int i; Mutex=CreateMutex(NULL,FALSE,NULL); Barber=CreateMutex(NULL,FALSE,NULL); //Chairs=CreateSemaphore(NULL,N,N,NULL); Customers=CreateSemaphore(NULL,0,N,NULL); CreateThread(NULL,0,BarberThread,&bNo,NULL,&dw); for(i=0;i<M;i++) { cNo[i]=i; CreateThread(NULL,0,CustomerThread,&cNo[i],NULL,&dw); } Sleep(60000); return 0; }