#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 關注
- 63 瀏覽
添加回答
舉報
0/150
提交
取消