日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++编程模拟生产者消费者模型

發布時間:2025/3/21 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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++编程模拟生产者消费者模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。