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

2022-10-10 19:36:09 字數 1778 閱讀 3558

一、概述

案例:編寫乙個案例**,使用訊號量(sem_t)來實現生產者消費者模型。

訊號量:相當於多把鎖,可以理解為加強版的互斥鎖,其在一定程度上可以提高併發的效率

相關函式

定義訊號量 sem_t sem;

int sem_init(sem_t *sem, int pshared, unsigned int

value);

函式描述: 初始化訊號量

函式引數:

sem: 訊號量變數

pshared: 0表示執行緒同步, 1表示程序同步

value: 最多有幾個執行緒操作共享資料

函式返回值:成功返回0, 失敗返回-1

, 並設定errno值

int sem_wait(sem_t *sem);

函式描述: 呼叫該函式一次, 相當於sem--, 當sem為0的時候, 引起阻塞

函式引數: 訊號量變數

函式返回值: 成功返回0, 失敗返回-1

, 並設定errno值

int sem_post(sem_t *sem);

函式描述: 呼叫一次, 相當於sem++函式引數: 訊號量變數

函式返回值: 成功返回0, 失敗返回-1

, 並設定errno值

int sem_trywait(sem_t *sem);

函式描述: 嘗試加鎖, 若失敗直接返回, 不阻塞

函式引數: 訊號量變數

函式返回值: 成功返回0, 失敗返回-1

, 並設定errno值

int sem_destroy(sem_t *sem);

函式描述: 銷毀訊號量

函式引數: 訊號量變數

函式返回值: 成功返回0, 失敗返回-1, 並設定errno值

使用步驟:

1.定義訊號量:sem_t

2.初始化訊號量:sem_init(sem_t *);

3.加鎖:sem_wait()

4.解鎖:sem_post

5.銷毀訊號量:sem_destroy(

二、**示例

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

#include #include #include #include #include #include #include //建立乙個結構體節點

typedef struct nodenode;

//建立頭節點

node *mfirst;

//定義訊號量

sem_t sem_producer;

sem_t sem_consumer;

//生產者執行緒**函式

void* producer(void* arg)

//給節點賦值

pnode->data = rand()%1000;

printf("p:[%d]\n",pnode->data);

pnode->next = mfirst;

mfirst = pnode;

//解鎖

sem_post(&sem_consumer);//生產出產品後立馬通知消費者執行緒進行消費

sleep(rand()%3);

}}//消費者執行緒**函式

void* consumer(void * arg)

}int main()

三、示例:p帶包生產者,c代表消費者

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

執行緒併發的生產者 消費者模型 1.兩個程序對同乙個記憶體資源進行操作,乙個是生產者,乙個是消費者。2.生產者往共享記憶體資源填充資料,如果區域滿,則等待消費者消費資料。3.消費者從共享記憶體資源取資料,如果區域空,則等待生產者填充資料。4.生產者的填充資料行為和消費者的消費資料行為不可在同一時間發...

使用訊號量實現生產者 消費者問題

問題描述 使用乙個緩衝區來儲存物品,只有緩衝區沒有滿,生產者才可以放入物品 只有緩衝區不為空,消費者才可以拿走物品。因為緩衝區屬於臨界資源,因此需要使用乙個互斥量 mutex 來控制對緩衝區的互斥訪問。為了同步生產者和消費者的行為,需要記錄緩衝區中物品的數量。數量可以使用訊號量來進行統計,這裡需要使...

Linux訊號量機制(生產者消費者)

該程式為linux訊號量機制實現程式,主要模擬了一般的生產者 消費者問題。生產者 消費者問題是乙個經典的程序同步問題,該問題最早由dijkstra提出,用以演示他提出的訊號量機制。在同乙個程序位址空間內執行的兩個執行緒。生產者執行緒生產物品,然後將物品放置在乙個空緩衝區中供消費者執行緒消費。消費者執...