#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...