//P(S) S=S-1
//V(S) S=S+1
//新生产一个产品
void Produce()
{
std::cerr<<"Producing"<<++ProduceID<<"...";
std::cerr<<"Succeed"<<std::endl;
}
//新生产的产品放入缓冲区
void Append()
{
std::cerr<<"Appending a product...";
g_buffer[in] = ProduceID;
in = (in+1)%SIZE_OF_BUFFER;
std::cerr<<"Succeed"<<std::endl;
for(int i=0;i<SIZE_OF_BUFFER;++i)
{
std::out<<i<<":"<<g_buffer[i];
if(i==in) std::out<<"<--生产";
if(i==out) std::out<<"<--消费";
std::out<<std::endl;
}
}
//从缓冲区取出一个产品
void Take()
{
std::cerr<<"Taking a product...";
ConsumeID = g_buferr[out];
out = (out+1)%SIZE_OF_BUFFER;
std::cerr<<"Succeed"<<std::endl;
//输出缓冲区当前状态
for(int i=0;i<SIZE_OF_BUFFER;++i)
{
std::cout<<i<<":"<<g_buffer[i];
if(i==in) std::cout<<"<--生产";
if(i==out) std::cout<<"<--消费";
std::cout<<std::endl;
}
}
void Consume()
{
std::cerr<<"Consuming"<<ConsumeID<<"...";
std::cerr<<"Succeed"<<std::endl;
}
//生产者
DWORD WINAPI Producer(LPVOID lpPara)
{
while(g_continue)
{
WaitForSingleObject(g_hFULLSemaphore,INFINITE);
WaitForSingleObject(g_hMutex,INFINITE);
Produce();
Append();
Sleep(1500);
ReleaseMutex(g_hMutex);
ReleaseSemaphore(g_hEmptySemaphore,1,NULL);
}
return 0;
}
//消费者
DWORD WINAPI Consumer(LPVOID lpPara)
{
while(g_continue)
{
WaitForSingleObject(g_hEmptySemaphore,INFINITE);
WaitFoeSingleObject(g_hMutex,INFINITE);
Take();
Consume();
Sleep(1500);
//ReleaseSemaphore
ReleaseMutex(g_hMutex);
ReleaseSemaphore(g_hEmptySemaphore,1,NULL);
}
return 0;
}
生产者-消费者(C++)|操作系统实验
最新推荐文章于 2021-10-22 15:26:47 发布