生產者消費者C++實現


#include<string>
#include<iostream>
#include<process.h>
#include<windows.h>
#include <stdlib.h>
#include<time.h>
#include<list>
using namespace std;
HANDLE empty,full; //同步信號量 緩沖池的剩余 緩沖池中的產品個數 生產者與消
費者同步
HANDLE mutex;//互斥信號量,生產者與生產者互斥,消費者與消費者互斥
int buf_max=5; //緩沖池大小
int product=0; //產品數量
typedef list<int> LISTINT;
LISTINT Buffer;
LISTINT::iterator i;
int getRandom()
{
return rand()%23;
}
void printBuffer()
{
cout<<"現在緩沖池中有:";
for (i = Buffer.begin(); i != Buffer.end(); ++i)
cout << *i << ",";
cout<<endl;
}
//生產者線程
unsigned __stdcall threadProducer(void *)
{
for(int i = 0; i < 5; i++){
Sleep(getRandom()*10);
WaitForSingleObject(empty, INFINITE);//等待同步信號量empty
WaitForSingleObject(mutex, INFINITE);//等待互斥信號量mutex
product++;
int p=getRandom();
Buffer.push_front(p);
cout<<"生產者生產了"<<p<<" ";
printBuffer();
Sleep(100);
ReleaseSemaphore(mutex, 1, NULL);//釋放互斥信號量mutex
ReleaseSemaphore(full, 1, NULL);//釋放同步信號量full
}
return 1;
}
//消費者線程
unsigned __stdcall threadConsumer(void *)
{
for(int i = 0; i < 5; i++){
Sleep(getRandom()*10);
WaitForSingleObject(full, INFINITE);//等待同步信號量full
WaitForSingleObject(mutex, INFINITE);//等待互斥信號量mutex
product--;
cout<<"消費者消費了產品"<<Buffer.back()<<" ";
Buffer.pop_back();
printBuffer();
Sleep(100);
ReleaseSemaphore(mutex, 1, NULL);//釋放互斥信號量mutex
ReleaseSemaphore(empty, 1, NULL);//釋放信號量
}
return 2;
}

void main()
{
bool flag=false;
while(!flag)
{
cout<<"緩沖池大小為"<<buf_max<<endl;
if(buf_max<=0);
else flag=true;
}
//創建信號量
empty = CreateSemaphore(NULL, buf_max, buf_max, NULL);//初值為緩沖池大
小,最大為緩沖池大小
full = CreateSemaphore(NULL, 0, buf_max, NULL); //初值為0,最大
為緩沖池大小
mutex = CreateSemaphore(NULL,1,1,NULL); //初值為1,最大為
1
HANDLE hth1, hth2; //線程句柄

//創建線程
hth1 = (HANDLE)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)
threadProducer, NULL, 0, NULL);//生產者線程
hth2 = (HANDLE)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)
threadConsumer, NULL, 0, NULL);//消費者線程

//等待子線程結束
WaitForSingleObject(hth1, INFINITE);
WaitForSingleObject(hth2, INFINITE);

//關閉句柄
CloseHandle(hth1);
CloseHandle(hth2);
CloseHandle(empty);
CloseHandle(full);
CloseHandle(mutex);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM