#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<windows.h>
using namespace std;
typedef int semaphore;/*信号量是一种特殊的整型变量*/
const int SIZE_OF_BUFFER=5;//缓冲区长度
const unsigned short PRODUCERS_COUNT=2;//生产者的个数
const unsigned short CONSUMERS_COUNT=3;//消费者的个数
DWORD producers[PRODUCERS_COUNT];//生产者线程的标识符
DWORD consumers[CONSUMERS_COUNT];//消费者线程的标识符
const unsigned short THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;//总的线程数
/**
*定义信号量
*/
HANDLE mutex;//互斥信号量
HANDLE full;//表示放有产品的缓冲区数,其初值为0
HANDLE empty;//表示可供使用的缓冲区数,其初值为N
/**
*定义共享缓冲区
*/
semaphore buffer[SIZE_OF_BUFFER];
/**
*定义生产者和消费者使用的指针
*/
int in=0;
int out=0;
int productNum=0;
DWORD WINAPI Producer(LPVOID);
DWORD WINAPI Consumer(LPVOID);
int main(int argc,char*argv[])
{
//创建Mutex和Semaphore 44.mutex=CreateMutex(NULL,FALSE,NULL);
full=CreateSemaphore(NULL,0,SIZE_OF_BUFFER,NULL);
empty=CreateSemaphore(NULL,SIZE_OF_BUFFER,SIZE_OF_BUFFER,NULL);
HANDLE PVThreads[THREADS_COUNT];//各线程的handle
//创建生产者线程
for(int i=0;i<PRODUCERS_COUNT;i++)
{
PVThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producers[i]);
if(PVThreads[i]==NULL)
break;
}
//创建消费者线程
for(int i=0;i<CONSUMERS_COUNT;i++)
{
PVThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0,&consumers[i]);
if(PVThreads[i]==NULL)
break;
}
bool isContinue=true;
while(isContinue)
{
if(getchar())
{//按回车后终止程序运行
isContinue=false;
}
}
system("PAUSE");
return 0;
}
void enBuffer(int pos)
{
cout<<"正在生产产品..."<<endl;
Sleep(2000);
buffer[pos]=-1;
productNum++;
cout<<"生产完成!已生产"<<productNum<<"个产品,并将新产品放在了缓冲区位置:"<<pos<<endl;
}
void deBuffer(int pos)
{
cout<<"正在消费产品..."<<endl;
Sleep(1000);
buffer[pos]=-2;
productNum--;
cout<<"已消费在缓冲区位置:"<<pos<<"的产品,缓冲区剩余空间:"<<SIZE_OF_BUFFER-productNum<<endl;
cout<<endl;
}
/**
*生产者
*/
DWORD WINAPI Producer(LPVOID lpParam)
{
while(1)
{
WaitForSingleObject(empty,INFINITE);//P(empty)生产者信号量-1
WaitForSingleObject(mutex,INFINITE);//P(mutex)获取线程间互斥信号
enBuffer(in);
Sleep(1000);
in=(in+1)%SIZE_OF_BUFFER;
ReleaseMutex(mutex);//V(mutex)释放线程间互斥信号
ReleaseSemaphore(full,1,NULL);//V(full)消费者信号量+1
}
return 0;
}
/**
*消费者
*/
DWORD WINAPI Consumer(LPVOID lpPara)
{
while(1)
{
WaitForSingleObject(full,INFINITE);//P(full)消费者信号量-1
WaitForSingleObject(mutex,INFINITE);//P(mutex)获得线程间互斥信号
deBuffer(out);
Sleep(1000);
out=(out+1)%SIZE_OF_BUFFER;
ReleaseMutex(mutex);//V(mutex)释放线程间互斥信号
ReleaseSemaphore(empty,1,NULL);//V(empty)生产者信号量+1 126.127.
}
return 0;
}
生产者消费者线程
最新推荐文章于 2024-06-24 10:44:21 发布