#include "stdafx.h"#include <conio.h>#include <stdlib.h>#include <fstream.h>#include <io.h>#include <string.h> #include <stdio.h>#include "windows.h"int customer[10];void bank1(int i){if(customer[i]=0){customer[i]=1;HANDLE mutex1;DWORD wait_mutex;mutex1=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex1");wait_mutex=WaitForSingleObject(mutex1,-1);cout<<"一号柜台叫"<<i<<"号"<<endl;cout<<"一号柜台服务中"<<endl;Sleep(1000);ReleaseMutex(mutex1);cout<<"一号柜台服务完毕"<<endl;}}void bank2(int i){if(customer[i]=0){customer[i]=1;HANDLE mutex2;DWORD wait_mutex;mutex2=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex2");wait_mutex=WaitForSingleObject(mutex2,-1);cout<<"二号柜台叫"<<i<<"号"<<endl;cout<<"二号柜台服务中"<<endl;Sleep(800);ReleaseMutex(mutex2);cout<<"二号柜台服务完毕"<<endl;}}void bank3(int i){if(customer[i]=0){customer[i]=1;HANDLE mutex3;DWORD wait_mutex;mutex3=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex3");wait_mutex=WaitForSingleObject(mutex3,-1);cout<<"三号柜台叫"<<i<<"号"<<endl;cout<<"三号柜台服务中"<<endl;Sleep(500);ReleaseMutex(mutex3);cout<<"三号柜台服务完毕"<<endl;}}void main(){for (int i=0;i<10;i++){customer[i]=0;}HANDLE mutex1;HANDLE mutex2;HANDLE mutex3;mutex1=CreateMutex(NULL,FALSE,"mutex1");mutex2=CreateMutex(NULL,FALSE,"mutex2");mutex3=CreateMutex(NULL,FALSE,"mutex3");HANDLE h_Thread[10];DWORD a;for( i=0;i<10;i++){ h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)bank1,&i,0,&a);h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)bank2,&i,0,&a);h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)bank3,&i,0,&a);WaitForSingleObject(h_Thread[i],5000);}}
1 回答

绝地无双
TA贡献1946条经验 获得超4个赞
你使用了线程, 线程给你的函数传递的参数是一个指针(CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)bank1,&i,0,&a); 所以在这里他把i的地址作为bank1的参数传递了过去,你在bank1函数里直接作为整型的值来使用(是个不确定的数比较大) 所以在if(customer[i]=0) 这句的时候数组就越界了,当然崩溃啦!
注意你写程序的时候if语句的判断也有问题 f(customer[*i]=0)少了个=号,应该写成f(customer[*i]==0)
可以试试看这样写(三个都一样)
void bank1(int *i)
{
if(customer[*i]==0)
{
customer[*i]=1;
HANDLE mutex1;
DWORD wait_mutex;
mutex1=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex1");
wait_mutex=WaitForSingleObject(mutex1,-1);
cout<<"一号柜台叫"<<i<<"号"<<endl;
cout<<"一号柜台服务中"<<endl;
Sleep(1000);
ReleaseMutex(mutex1);
cout<<"一号柜台服务完毕"<<endl;
}
}
- 1 回答
- 0 关注
- 57 浏览
添加回答
举报
0/150
提交
取消