一、概述
案例:編寫乙個案例**,使用訊號量(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(
二、**示例
//使用訊號量實現生產者消費者模型三、示例:p帶包生產者,c代表消費者#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()
Windows 用訊號量實現生產者 消費者模型
執行緒併發的生產者 消費者模型 1.兩個程序對同乙個記憶體資源進行操作,乙個是生產者,乙個是消費者。2.生產者往共享記憶體資源填充資料,如果區域滿,則等待消費者消費資料。3.消費者從共享記憶體資源取資料,如果區域空,則等待生產者填充資料。4.生產者的填充資料行為和消費者的消費資料行為不可在同一時間發...
使用訊號量實現生產者 消費者問題
問題描述 使用乙個緩衝區來儲存物品,只有緩衝區沒有滿,生產者才可以放入物品 只有緩衝區不為空,消費者才可以拿走物品。因為緩衝區屬於臨界資源,因此需要使用乙個互斥量 mutex 來控制對緩衝區的互斥訪問。為了同步生產者和消費者的行為,需要記錄緩衝區中物品的數量。數量可以使用訊號量來進行統計,這裡需要使...
Linux訊號量機制(生產者消費者)
該程式為linux訊號量機制實現程式,主要模擬了一般的生產者 消費者問題。生產者 消費者問題是乙個經典的程序同步問題,該問題最早由dijkstra提出,用以演示他提出的訊號量機制。在同乙個程序位址空間內執行的兩個執行緒。生產者執行緒生產物品,然後將物品放置在乙個空緩衝區中供消費者執行緒消費。消費者執...