C++编程模拟生产者消费者模型
生活随笔
收集整理的這篇文章主要介紹了
C++编程模拟生产者消费者模型
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
生產者消費者問題是操作系統中典型的進程同步互斥問題,(英語:Producer-Consumer problem),也稱有限緩沖問題(英語:Bounded-buffer problem),是一個多線程同步問題的經典案例。
該問題描述了兩個共享固定大小緩沖區的線程“生產者”(Producer)和“消費者”(Consumer)在實際運行時會發生的問題。
生產者的主要作用是生成一定量的數據放到緩沖區中,然后重復此過程。與此同時,消費者也在緩沖區消耗這些數據。
問題的約束條件是要保證生產者不會在緩沖區滿時加入數據,消費者也不會在緩沖區中為空時消耗數據。
下面的C++程序代碼用水果的例子模擬生產者消費者模型,生產者隨機生產水果列表{"Apple","Banana","Cherry","Orange","Pear","Peach","WaterMelon"}中的一種,緩沖區用數組模擬。
程序應用了互斥鎖和信號量,使用了CreateMutex,ReleaseMutex,CreateSemaphore,ReleaseSemaphore,WaitForSingleObject等Windows下的線程函數。
C++代碼如下:
#include <iostream> #include <cstdlib> #include <windows.h> #include <string> #include <time.h>using namespace std;const int limit = 30; //生產總量 const int maxsize = 10; //緩沖區大小 const int kind = 7; int bufIdx = 0; //當前緩沖區下標string buf[maxsize]; //緩沖區 (字符串)//偽造的產品 string product[] = {"Apple","Banana","Cherry","Orange","Pear","Peach","WaterMelon"};HANDLE mutex,full,empty;HANDLE disp; //用于控制屏幕打印的互斥鎖//生產者子過程 DWORD WINAPI Producer(LPVOID param) {int ct,idx;const int pwait = 100;srand(time(NULL)); //隨機數播種WaitForSingleObject(disp, INFINITE);cout << "Producer Start!" << endl << endl;ReleaseMutex(disp);for (ct = 0; ct < limit; ct ++){idx = rand() % kind;WaitForSingleObject(disp, INFINITE);cout << product[idx] << " is ready!" << endl << endl;ReleaseMutex(disp);WaitForSingleObject(empty, INFINITE); //請求一個空緩沖區,阻塞WaitForSingleObject(mutex, INFINITE); //請求互斥鎖,阻塞buf[bufIdx ++] = product[idx];WaitForSingleObject(disp, INFINITE);cout << product[idx] << " added to slot No. " << bufIdx << endl << endl;ReleaseMutex(disp);ReleaseMutex(mutex); //釋放互斥鎖ReleaseSemaphore (full, 1, NULL); //signal(full)Sleep(rand() % pwait + 100); //休息一會}cout << "Producer Quit!" << endl << endl;return 0; }//消費者子過程 DWORD WINAPI Consumer(LPVOID param) {int ct;const int cwait = 300;string stuff;srand(time(NULL));WaitForSingleObject(disp, INFINITE);cout << "Consumer Start!" << endl << endl;ReleaseMutex(disp);for (ct = 0; ct < limit; ct ++){WaitForSingleObject(full, INFINITE); //請求一個滿緩沖區,阻塞WaitForSingleObject(mutex, INFINITE); //請求互斥鎖,阻塞stuff = buf[-- bufIdx];WaitForSingleObject(disp, INFINITE);cout << "Consumer get " << stuff << " from slot No. " << (bufIdx + 1) << endl << endl;ReleaseMutex(disp);ReleaseMutex(mutex); //釋放互斥鎖ReleaseSemaphore (empty, 1, NULL); //signal(empty)Sleep(rand() % cwait + 100); //休息一會}cout << "Consumer Quit!" << endl << endl;return 0; }int main() {//生產者線程與消費者線程的線程IDDWORD ProducerID, ConsumerID;//線程句柄HANDLE ProducerHandle, ConsumerHandle;//創建生產者線程ProducerHandle = CreateThread(NULL, 0, Producer, NULL, 0, &ProducerID);//創建消費者線程ConsumerHandle = CreateThread(NULL, 0, Consumer, NULL, 0, &ConsumerID);disp = CreateMutex(NULL, FALSE, NULL);//創建互斥鎖mutex = CreateMutex(NULL, FALSE, NULL);//創建緩沖區占用信號量full = CreateSemaphore (NULL, 0, maxsize, "full");//創建緩沖區空閑信號量empty = CreateSemaphore (NULL, maxsize, maxsize, "empty");//等待直到生產者線程執行完成if (ProducerHandle != NULL){WaitForSingleObject(ProducerHandle, INFINITE);CloseHandle(ProducerHandle);}//等待直到消費者線程執行完成if (ConsumerHandle != NULL){WaitForSingleObject(ConsumerHandle, INFINITE);CloseHandle(ConsumerHandle);}system("pause"); }總結
以上是生活随笔為你收集整理的C++编程模拟生产者消费者模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开源免费的C/C++网络库(c/c++
- 下一篇: 增大Linux的socket最大连接数(