程序同步的經典演算法 生產者和消費者

2021-06-22 10:49:03 字數 2348 閱讀 5185

#include #include const unsigned short size_of_buffer = 2; //緩衝區長度

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()

{ //建立各個互斥訊號

//注意,互斥訊號量和同步訊號量的定義方法不同,互斥訊號量呼叫的是createmutex函式,同步訊號量

//呼叫的是createsemaphore函式,函式的返回值都是控制代碼。

mutex = createmutex(null,false,null);

emptysemaphore = createsemaphore(null,size_of_buffer,size_of_buffer,null);

//將上句做如下修改,看看結果會怎樣

//emptysemaphore = createsemaphore(null,0,size_of_buffer-1,null);

fullsemaphore = createsemaphore(null,0,size_of_buffer,null);

//調整下面的數值,可以發現,當生產者個數多於消費者個數時,

//生產速度快,生產者經常等待消費者;反之,消費者經常等待

const unsigned short producers_count = 1; //生產者的個數

const unsigned short consumers_count = 3; //消費者的個數

//總的執行緒數

const unsigned short threads_count = producers_count+consumers_count;

handle hthreads[threads_count]; //各執行緒的handle

dword producerid[producers_count]; //生產者執行緒的識別符號

dword consumerid[consumers_count]; //消費者執行緒的識別符號

//建立生產者執行緒

for (int i=0;ilpsa

新執行緒的安全特性。

dwstacksize

新執行緒的堆疊大小。

pfnthreadproc

新執行緒的執行緒過程。

pvparam

將傳遞的引數傳遞給執行緒過程。

dwcreationflags

建立標誌(0個或create_suspended)。

pdwthreadid

[out] 中,若成功,接收新建立的執行緒的執行緒id dword變數的位址

步驟四:1:首先我們將消費者設為1,生產者也設為1;

可以明顯發現,基本每次生產一下,就被消費了。也就是說,基本沒有執行緒出現大量時間的滯留

情況二:生產者為3,消費者為1

分析:生產者的能力這時就稍微強於情況一了,所以可以發現基本雙零的情況很少見。

情況三:生產者未一,消費者為三。

分析:通過執行緒的個數不同,我們可以給生產消費不同的能力大小。當生產者的執行緒數目多時,很容易發現,緩衝區的狀態基本很少為零。當消費者的數目較多時,可以發現緩衝區的狀態基本為零。

步驟五:

改變緩衝區的大小,當緩衝區空時迫使消費者等待,如果此時將這裡的緩衝區減小乙個,應該可以推測出緩衝區的狀態,始終不可能為零。

OS 程序同步 生產者消費者

注意 在每個程式中多個wait操作順序不可以顛倒。應先執行對資源訊號量的wait操作,然後再執行對互斥訊號量的wait操作,否則可能引起程序死鎖。概述 p操作 同步再前,互斥再後 記錄型訊號量 include using namespace std int in 0 佇列的隊首 int out 0 ...

經典程序同步與互斥問題 生產者消費者問題

問題描述 生產者 消費者問題是指有兩組程序共享乙個環形的緩衝池,一組稱為生產者,一組稱為消費者。緩衝池是由若干個大小相等的緩衝區組成,每個緩衝區可以容納乙個產品。生產者程序不斷的將產品放入緩衝池中,消費者不斷將產品從緩衝池中取出。核心 生產者 消費者問題,既存在著程序同步問題,也存在著臨界區互斥問題...

C 模擬「生產者消費者」程序同步問題

include include include include include using namespace std const int limit 30 生產總量 const int maxsize 10 緩衝區大小 const int kind 7 int bufidx 0 當前緩衝區下標 s...