#include <windows.h>
#include <iostream>
using namespace std;
#define MAX 10
DWORD WINAPI Producer(LPVOID lpParameter);
DWORD WINAPI Consumer(LPVOID lpParameter);
int buffer[MAX];
int ID=0;
int in=0;
int out=0;
int exit1=0;
int gain=0;
HANDLE Mutex;
HANDLE EMPTY;
HANDLE FULL;
void print1(void);
int main()
{
HANDLE hThread[MAX],hThreadc[MAX];
Mutex=CreateMutex(NULL,FALSE,NULL);
EMPTY=CreateSemaphore(NULL,MAX-1,MAX-1,NULL);
FULL=CreateSemaphore(NULL,0,MAX-1,NULL);
for(int i=0; i < MAX; i++)
buffer[i]=-1;
for(int j=1; j <= 5; j++)
hThread[j]=CreateThread(NULL,0,Producer,NULL,0,NULL);
for(j=1; j <= 3; j++)
hThreadc[j]=CreateThread(NULL,0,Consumer,NULL,0,NULL);
while(exit1 == 0){
if(getchar()){ //按回车后终止程序运行
exit1=1;
}
}
return 0;
}
DWORD WINAPI Producer(LPVOID lpParameter)
{
while (true){
WaitForSingleObject(EMPTY,INFINITE);
WaitForSingleObject(Mutex,INFINITE);
ID++;
cout<<"生产一个产品:"<<ID<<endl;
in=(in+1)%MAX;
buffer[in]=ID;
Sleep(1000);
print1();
ReleaseMutex(Mutex);
ReleaseSemaphore(FULL,1,NULL);
}
return 0;
}
DWORD WINAPI Consumer(LPVOID lpParameter)
{
while (true){
WaitForSingleObject(FULL,INFINITE);
WaitForSingleObject(Mutex,INFINITE);
out=(out+1)%MAX;
gain=buffer[out];
buffer[out]=-1;
cout<<"消费一个产品:"<<gain<<endl;
print1();
ReleaseMutex(Mutex);
ReleaseSemaphore(EMPTY,1,NULL);
}
return 0;
}
void print1(void)
{
cout<<"当前buffer中的产品清单:"<<endl;
for(int i=0; i < MAX; i++)
if(buffer[i] != -1)
cout<<buffer[i]<<" ";
cout<<endl;
}