Windows 用訊號量實現生產者 消費者模型

2022-02-13 22:38:19 字數 2086 閱讀 6095

執行緒併發的生產者-消費者模型:

1.兩個程序對同乙個記憶體資源進行操作,乙個是生產者,乙個是消費者。

2.生產者往共享記憶體資源填充資料,如果區域滿,則等待消費者消費資料。

3.消費者從共享記憶體資源取資料,如果區域空,則等待生產者填充資料。

4.生產者的填充資料行為和消費者的消費資料行為不可在同一時間發生。

下面用windows的訊號量以及執行緒等api模擬生產者-消費者模型

#include #include 

#define n 100

#define true 1typedef

intsemaphore;

semaphore full = 0, empty = n; //

共享資源區滿槽數目和空槽數目

intin = 0, out = 0; //

緩衝區生產,消費資料指標

handle mutex;

int producerthread[5

];int consumerthread[5

];int buffer[n+4]; //

緩衝區int produce_item()

int insert_item(int item)

int remove_item()

int consume_item(int

item)

void down(handle handle)

void up(handle handle)

dword winapi producer(lpvoid v)

sleep(

2000

); }

return1;

}dword winapi consumer(lpvoid v)

sleep(

2000

); }

return1;

}int

main()

sleep(

20000

);

return0;

}

執行結果:

或者使用自定義的訊號量mutex來實現:

#include #include 

#define n 100

#define true 1typedef

intsemaphore;

semaphore mutex = 1; //

互斥訊號量

semaphore full = 0, empty = n; //

臨界區滿槽數目和空槽數目

intin = 0, out = 0; //

緩衝區生產,消費資料指標

int producerthread[5

];int consumerthread[5

];int buffer[n+4]; //

緩衝區int produce_item()

int insert_item(int item)

int remove_item()

int consume_item(int

item)

dword winapi producer(lpvoid v)

sleep(

2000

); }

return1;

}dword winapi consumer(lpvoid v)

sleep(

2000

); }

return1;

}int

main()

sleep(

20000

);

return0;

}

也能達到效果:

訊號量 二值訊號量

訊號量 二值訊號量 訊號量是作業系統的重要部分,訊號量一般用來進行資源管理和任務同步。freertos中訊號量分為二值訊號量 互斥訊號量 計數訊號量和遞迴互斥訊號量,應用場景各不同。二值訊號量通常用於互斥訪問或同步,二值訊號量和互斥訊號量非常相似,但互斥訊號量有優先順序,二值訊號量沒有。因此二值訊號...

python訊號量 Python訊號量

python訊號量教程 訊號量是由作業系統管理的一種抽象資料型別,用於在多執行緒中同步對共享資源的使用。本質上說,訊號量是乙個內部資料,用於標明當前的共享資源可以有多少併發讀取。也可以簡單的理解為,訊號量是多把鎖,同時允許多個執行緒來更改資料,而 python訊號量與互斥鎖的關係 訊號量的乙個特殊用...

訊號 訊號量

訊號是由 系統或者程序傳送給目標程序的資訊,以通知目標程序某個狀態的改變或系統異常。linux訊號可以由如下條件產生 1 對於前台程序,使用者可以通過輸入特殊的終端字元來給它傳送訊號。比如輸入ctrl c通常或給程序傳送乙個中斷訊號 2 系統異常。比如浮點異常和非法記憶體段訪問。3 系統狀態變化 4...