system v下的訊號量主要用於程序間通訊,也可以用於執行緒(不推薦)
posix下的訊號量主要用於執行緒間通訊,也可以用於程序(不推薦)
本篇主要研究posix下的訊號量
訊號量變數的型別為sem_t。主要介面:
訊號量的建立:
int sem_init(sem_t *sem, int pshared, unsigned int value);
引數1:sem訊號量位址
引數2:pshared引數為0,表示訊號量用於同一程序的執行緒間; pshared引數不為0,表示訊號量用於程序間。
引數3:value引數表示可用資源的數量
訊號量的申請:
int sem_wait(sem_t *sem) //阻塞式(p操作)
int sem_trywait(sem_t *sem) //非阻塞式(p操作)
使訊號量的值減1,如果呼叫sem_wait()時,訊號量的值已經是0,則掛起等待。若不想掛起等待則可非阻塞式申請資源即呼叫sem_trywait()。
訊號量的釋放:
int sem_post(sem_t *sem) //(v操作)
使semaphore 的值加1,同時喚醒掛起等待的執行緒。
以生產者消費者模型為例(交易場所使用環形佇列):
POSIX訊號量 生產者消費者模型
今天我們來寫乙個基於固定大小的環形佇列的生產者消費者模型。首先來畫圖說明一下 這是乙個環形佇列的生產者消費者模型。生產者用p表示,消費者用c表示。這個環形佇列的每一段空間我們用semblank表示,放入的內容我們用semdata表示。生產者首先要申請乙個semblank,然後放入semdata。消費...
生產者消費者模型 基於Posix訊號量和互斥量
這種方式可以用訊號量初值來定義倉庫大小,迴圈生產和消費 生產者 while 1 消費者 while 1 實現 include include include include include define pro count 3 define com count 3 define bufsize 5 ...
Linux訊號量機制(生產者消費者)
該程式為linux訊號量機制實現程式,主要模擬了一般的生產者 消費者問題。生產者 消費者問題是乙個經典的程序同步問題,該問題最早由dijkstra提出,用以演示他提出的訊號量機制。在同乙個程序位址空間內執行的兩個執行緒。生產者執行緒生產物品,然後將物品放置在乙個空緩衝區中供消費者執行緒消費。消費者執...