消费者与生产者问题
来源:互联网 发布:网络视听节目审核通则 编辑:程序博客网 时间:2024/05/03 09:26
#include<windows.h>
#include<iostream>
const unsigned short SIZE_OF_BUFFER=4;
unsigned short ProductID=0;
unsigned short ConsumeID=0;
unsigned short in=0;
unsigned short out=0;
int buffer[SIZE_OF_BUFFER];
bool p_ccontinue=true;
HANDLE Mutex;
HANDLE FullSemaphore;
HANDLE EmptySemaphore;
DWORD WINAPI Producer(LPVOID);
DWORD WINAPI Consumer(LPVOID);
int main()
{
Mutex=CreateMutex(NULL,FALSE,NULL);
EmptySemaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER,SIZE_OF_BUFFER,NULL);
FullSemaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER,NULL);
const unsigned short PRODUCERS_COUNT=3;
const unsigned short CONSUMERS_COUNT=1;
const unsigned short THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;
HANDLE hThreads[THREADS_COUNT];
DWORD producerID[PRODUCERS_COUNT];
DWORD consumerID[CONSUMERS_COUNT];
for(int i=0;i<PRODUCERS_COUNT;++i){
hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);
if(hThreads[i]==NULL) return -1;
}
for(i=0;i<CONSUMERS_COUNT;++i){
hThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[i]);
if(hThreads[i]==NULL) return -1;
}
while(p_ccontinue){
if(getchar()){
p_ccontinue=false;
}
}
return 0;
}
void Produce()
{
std::cout<<std::endl<<"Producing"<<++ProductID<<"...";
std::cout<<"Succeed"<<std::endl;
}
void Append()
{
std::cerr<<"Appending a product ...";
buffer[in]=1;
in=(in+1)%SIZE_OF_BUFFER;
std::cerr<<"Succeed"<<std::endl;
for(int i=0;i<SIZE_OF_BUFFER;++i){
std::cout<<i<<": "<<buffer[i];
if(i==in) std::cout<<" <--生产";
if(i==out) std::cout<<" <--消费";
std::cout<<std::endl;
}
}
void Take()
{
std::cerr<<"Taking a product ...";
//ConsumeID=buffer[out];
buffer[out]=0;
out=(out+1)%SIZE_OF_BUFFER;
std::cerr<<"Succeed"<<std::endl;
for(int i=0;i<SIZE_OF_BUFFER;++i)
{
std::cout<<i<<": "<<buffer[i];
if(i==in) std::cout<<" <--生产";
if(i==out) std::cout<<" <--消费";
std::cout<<std::endl;
}
}
void Consume()
{
std::cout<<std::endl<<"Consuming "<<++ConsumeID<<"...";
std::cout<<"Succeed"<<std::endl;
}
DWORD WINAPI Producer(LPVOID lpPara)
{
while(p_ccontinue){
WaitForSingleObject(EmptySemaphore,INFINITE);
WaitForSingleObject(Mutex,INFINITE);
Produce();
Append();
Sleep(1500);
ReleaseMutex(Mutex);
ReleaseSemaphore(FullSemaphore,1,NULL);
}
return 0;
}
DWORD WINAPI Consumer(LPVOID lpPara)
{
while(p_ccontinue){
WaitForSingleObject(FullSemaphore,INFINITE);
WaitForSingleObject(Mutex,INFINITE);
Take();
Consume();
Sleep(1500);
ReleaseMutex(Mutex);
ReleaseSemaphore(EmptySemaphore,1,NULL);
}
return 0;
}
- 生产者与消费者问题
- 生产者与消费者问题
- 生产者与消费者问题
- 生产者与消费者问题
- 生产者与消费者问题
- 生产者与消费者问题
- 生产者与消费者问题
- 消费者与生产者问题
- 生产者与消费者问题
- 生产者与消费者问题
- 消费者与生产者问题
- 生产者与消费者问题
- 生产者与消费者问题
- 生产者与消费者问题
- 生产者与消费者问题
- java生产者与消费者问题
- 消费者与生产者问题代码
- C#生产者与消费者问题
- 杭州IDC、服务器托管、服务器租用、CDN
- CREATE TABLE
- 目标图像特征提取算子(HOG)
- java.util.zip 类 ZipEntry
- android: jni socket
- 消费者与生产者问题
- C# Stream 和 byte[] 之间的转换
- Keepalived+Tengine实现高可用集群
- 杭州IDC、服务器托管、服务器租用
- Kafka剖析(一):高扩展、高吞吐的分布式消息系统初探
- 算法---完美洗牌(难)
- Windows server 2008,IIS7不支持MVC url映射
- Webrtc Intro - SCTP
- 【protobuf】 2.在Unity中引用ProtoBuf