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;
}
- baber main thread barber thread
- Main Thread & UI Thread
- Android UI thread / main thread
- Android UI thread / main thread
- main Queue 与 main Thread
- main thread starting…
- main thread in android application
- Exception in thread "main" AxisFault
- How the Main Thread works
- RT-thread main函数分析
- Thread
- thread
- Thread
- Thread
- thread
- thread
- Thread
- Thread
- Java开发数据库默认端口及网络常用端口
- 【算法设计作业】Week1
- Scrapy 的 Spider 的编写
- 浅谈vue 项目router (路由)+ views(界面)配置方案
- 何为Ant
- baber main thread barber thread
- JavaScript中的apply()
- SQL权限授予和收回
- Python 爬虫框架 Item 的编写
- 采用Github管理个人代码简明教程
- WebService的简介
- 计算机漏洞安全相关的概念POC | EXP | VUL | CVE | 0DAY
- Gan与imitation learning,theano平台搭建(1)
- java 内存分配