#include <iostream.h>
#include <windows.h>
HANDLE hMutex;
HANDLE hNotFullEvent;
HANDLE hAlphabetEvent,hNumberEvent,hSymbolEvent;
const int BufferSize = 15;
char Buffer[BufferSize];
int count = 0;
int alphabet = 0;
int number = 0;
int symbol = 0;
int head = 0;
int tail = 0;
/************************************************
/*
/* 显示缓冲区情况函数
/*
************************************************/
void showbuffer(char a[15])
{
cout<<"缓冲区存储情况为(^为已消费资源):";
for(int i=0;i<15;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
/************************************************
/*
/* 生产者进程P1:输入大写字母A
/*
************************************************/
UINT ProThreadP1(LPVOID pParam)
{
for(;;)
{
for(;;)
{
WaitForSingleObject(hMutex,INFINITE);
if( count == BufferSize )
{
ReleaseMutex(hMutex);
WaitForSingleObject(hNotFullEvent,INFINITE);
continue;
}
break;
}
cout<<"生产者进程P1:产生大写字母A"<<endl;
Buffer[tail] = 'A';
showbuffer(Buffer);
if(tail == 14)
tail = 0;
else
tail++;
count++;
alphabet++;
cout<<"按Enter继续,按q退出程序:"<<endl;
char ch;
ch = cin.get();
if(ch == 'q' || ch == 'Q')
{
ReleaseMutex(hMutex);
PulseEvent(hAlphabetEvent);
exit(0);
}
ReleaseMutex(hMutex);
PulseEvent(hAlphabetEvent);
}
}
/************************************************
/*
/* 生产者进程P2:输入数字1
/*
************************************************/
UINT ProThreadP2(LPVOID pParam)
{
for(;;)
{
for(;;)
{
WaitForSingleObject(hMutex,INFINITE);
if( count == BufferSize )
{
ReleaseMutex(hMutex);
WaitForSingleObject(hNotFullEvent,INFINITE);
continue;
}
break;
}
cout<<"生产者进程P2:产生数字1"<<endl;
Buffer[tail] = '1';
showbuffer(Buffer);
if(tail == 14)
tail = 0;
else
tail++;
count++;
number++;
cout<<"按Enter继续,按q退出程序:"<<endl;
char ch;
ch = cin.get();
if(ch == 'q' || ch == 'Q')
{
ReleaseMutex(hMutex);
PulseEvent(hNumberEvent);
exit(0);
}
ReleaseMutex(hMutex);
PulseEvent(hNumberEvent);
}
}
/************************************************
/*
/* 生产者进程P3:输入符号*
/*
************************************************/
UINT ProThreadP3(LPVOID pParam)
{
for(;;)
{
for(;;)
{
WaitForSingleObject(hMutex,INFINITE);
if( count == BufferSize )
{
ReleaseMutex(hMutex);
WaitForSingleObject(hNotFullEvent,INFINITE);
continue;
}
break;
}
cout<<"生产者进程 p3:产生符号* "<<endl;
Buffer[tail] = '*';
showbuffer(Buffer);
if(tail == 14)
tail = 0;
else
tail++;
count++;
symbol++;
cout<<"按Enter继续,按q退出程序:"<<endl;
char ch;
ch = cin.get();
if(ch == 'q' || ch == 'Q')
{
ReleaseMutex(hMutex);
PulseEvent(hSymbolEvent);
exit(0);
}
ReleaseMutex(hMutex);
PulseEvent(hSymbolEvent);
}
}
/************************************************
/*
/* 消费者进程C1:大写A转成小写a
/*
************************************************/
UINT ConThreadC1(LPVOID pParam)
{
for(;;)
{
WaitForSingleObject(hMutex,INFINITE);
if(alphabet == 0)
{
ReleaseMutex(hMutex);
WaitForSingleObject(hAlphabetEvent,INFINITE);
continue;
}
else
{
cout<<"消费者进程C1:大写A转成小写a"<<endl;
int i;
for(i=head;Buffer[i] != 'A';)
{
if(i == 14)
{
if(Buffer[i] == 'A')
break;
i = 0;
continue;
}
i++;
}
Buffer[i] = 'a';
showbuffer(Buffer);
if(i-head>=0)
{
for(int j=0;j<i-head;j++)
{
Buffer[i] = Buffer[i-1];
i--;
}
}
else
{
for(;i>0;i--)
{
Buffer[i] = Buffer[i-1];
}
Buffer[i] = Buffer[BufferSize-1];
for(i=BufferSize-1;i-head>0;i--)
{
Buffer[i] = Buffer[i-1];
}
}
Buffer[head] = '^';
if(head == 14)
head = 0;
else
head++;
count--;
alphabet--;
cout<<"按Enter继续,按q退出程序:"<<endl;
char ch;
ch = cin.get();
if(ch == 'q' || ch == 'Q')
{
ReleaseMutex(hMutex);
PulseEvent(hNotFullEvent);
exit(0);
}
ReleaseMutex(hMutex);
PulseEvent(hNotFullEvent);
}
}
}
/************************************************
/*
/* 消费者进程C2:将数字1转为数字2
/*
************************************************/
UINT ConThreadC2(LPVOID pParam)
{
for(;;)
{
WaitForSingleObject(hMutex,INFINITE);
if(number == 0)
{
ReleaseMutex(hMutex);
WaitForSingleObject(hNumberEvent,INFINITE);
continue;
}
else
{
cout<<"消费者进程C2:将数字1转为数字2"<<endl;
int i;
for(i=head;Buffer[i] != '1';)
{
if(i == 14)
{
if(Buffer[i] == '1')
break;
i = 0;
continue;
}
i++;
}
Buffer[i] = '2';
showbuffer(Buffer);
if(i-head>=0)
{
for(int j=0;j<i-head;j++)
{
Buffer[i] = Buffer[i-1];
i--;
}
}
else
{
for(;i>0;i--)
{
Buffer[i] = Buffer[i-1];
}
Buffer[i] = Buffer[BufferSize-1];
for(i=BufferSize-1;i-head>0;i--)
{
Buffer[i] = Buffer[i-1];
}
}
Buffer[head] = '^';
if(head == 14)
head = 0;
else
head++;
count--;
number--;
cout<<"按Enter继续,按q退出程序:"<<endl;
char ch;
ch = cin.get();
if(ch == 'q' || ch == 'Q')
{
ReleaseMutex(hMutex);
PulseEvent(hNotFullEvent);
exit(0);
}
ReleaseMutex(hMutex);
PulseEvent(hNotFullEvent);
}
}
}
/************************************************
/*
/* 消费者进程C3:将符号*转为符号#
/*
************************************************/
UINT ConThreadC3(LPVOID pParam)
{
for(;;)
{
WaitForSingleObject(hMutex,INFINITE);
if(symbol == 0)
{
ReleaseMutex(hMutex);
WaitForSingleObject(hSymbolEvent,INFINITE);
continue;
}
else
{
cout<<"消费者进程C3:将符号*转为符号#"<<endl;
int i;
for(i=head;Buffer[i] != '*';)
{
if(i == 14)
{
if(Buffer[i] == '*')
break;
i = 0;
continue;
}
i++;
}
Buffer[i] = '#';
showbuffer(Buffer);
if(i-head>=0)
{
for(int j=0;j<i-head;j++)
{
Buffer[i] = Buffer[i-1];
i--;
}
}
else
{
for(;i>0;i--)
{
Buffer[i] = Buffer[i-1];
}
Buffer[i] = Buffer[BufferSize-1];
for(i=BufferSize-1;i-head>0;i--)
{
Buffer[i] = Buffer[i-1];
}
}
Buffer[head] = '^';
if(head == 14)
head = 0;
else
head++;
count--;
symbol--;
cout<<"按Enter继续,按q退出程序:"<<endl;
char ch;
ch = cin.get();
if(ch == 'q' || ch == 'Q')
{
ReleaseMutex(hMutex);
PulseEvent(hNotFullEvent);
exit(0);
}
ReleaseMutex(hMutex);
PulseEvent(hNotFullEvent);
}
}
}
/************************************************
/*
/* 消费者进程C4:大写A转成大写B
/*
************************************************/
UINT ConThreadC4(LPVOID pParam)
{
for(;;)
{
WaitForSingleObject(hMutex,INFINITE);
if(alphabet == 0)
{
ReleaseMutex(hMutex);
WaitForSingleObject(hAlphabetEvent,INFINITE);
continue;
}
else
{
cout<<"消费者进程C4:大写A转成大写B"<<endl;
int i;
for(i=head;Buffer[i] != 'A';)
{
if(i == 14)
{
if(Buffer[i] == 'A')
break;
i = 0;
continue;
}
i++;
}
Buffer[i] = 'B';
showbuffer(Buffer);
if(i-head>=0)
{
for(int j=0;j<i-head;j++)
{
Buffer[i] = Buffer[i-1];
i--;
}
}
else
{
for(;i>0;i--)
{
Buffer[i] = Buffer[i-1];
}
Buffer[i] = Buffer[BufferSize-1];
for(i=BufferSize-1;i-head>0;i--)
{
Buffer[i] = Buffer[i-1];
}
}
Buffer[head] = '^';
if(head == 14)
head = 0;
else
head++;
count--;
alphabet--;
cout<<"按Enter继续,按q退出程序:"<<endl;
char ch;
ch = cin.get();
if(ch == 'q' || ch == 'Q')
{
ReleaseMutex(hMutex);
PulseEvent(hNotFullEvent);
exit(0);
}
ReleaseMutex(hMutex);
PulseEvent(hNotFullEvent);
}
}
}
int main()
{
HANDLE hThreadVector[7];
DWORD ThreadID;
hMutex=CreateMutex(NULL,FALSE,NULL);
hNotFullEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
hThreadVector[0]=CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE)
ProThreadP1,NULL, 0, (LPDWORD)&ThreadID);
hThreadVector[1]=CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE)
ConThreadC3,NULL, 0, (LPDWORD)&ThreadID);
hThreadVector[2]=CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE)
ProThreadP3,NULL, 0, (LPDWORD)&ThreadID);
hThreadVector[3]=CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE)
ConThreadC1,NULL, 0, (LPDWORD)&ThreadID);
hThreadVector[4]=CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE)
ConThreadC2,NULL, 0, (LPDWORD)&ThreadID);
hThreadVector[5]=CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE)
ProThreadP2,NULL, 0, (LPDWORD)&ThreadID);
hThreadVector[6]=CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE)
ConThreadC4,NULL, 0, (LPDWORD)&ThreadID);
WaitForMultipleObjects(7,hThreadVector,TRUE,INFINITE);
return 0;
}
根据这个换成精简一点,换成缓冲池为10.三个生产消费,