生產者 消費者模型之訊號量

2021-08-02 02:13:26 字數 1769 閱讀 9073

訊號量:

(1)定義訊號量:

sem_t semaphore; //定義乙個名為semaphore的訊號量;

(2)初始化訊號量 

int sem_init(sem_t *sem, int pshared, unsigned int value); 

引數:

sem_t*  sem:要初始化的訊號量;

int pshared:pshared = 0;

usigned int value:該訊號訊號量的初值;

返回值:

a.返回0,表示初始化成功;

b.返回-1,表示操作失敗;

(3)p操作

int sem_wait(sem_t* sem);        //對於訊號量sem進行p操作;

int sem_trywait(sem_t* sem);

(4)v操作

int sem_post(sem_t* sem);        //對於訊號量sem進行v操作

生產者-消費者模型:

交易場所:環形佇列;

注:使用訊號量進行互斥和同步;

單程序單生產者--單消費者**實現:

producter_consumer.c

#include#include#includesem_t blank_count;

sem_t data_count;

int cycle_queue[20];

void* producter_running(void* arg)

}void* consumer_running(void* arg)

}//producter_consumer based on single thread

int main()

makefile:

producter_consumer:producter_consumer.c

gcc -o $@ $^ -lpthread

.phony:clean

clean:

rm -f producter_consumer

執行結果: 

單程序多生產者多消費者的生產者消費者模型:

producter_consumer.c

#include#include#includesem_t blank_count;

sem_t data_count;

int cycle_queue[20];

pthread_mutex_t pro = pthread_mutex_initializer;

pthread_mutex_t con = pthread_mutex_initializer;

void* producter_running(void* arg)

return null;

}void* consumer_running(void* arg)

}//producter_consumer based on single thread

int main()

執行結果:

訊號量(生產者和消費者模型)

訊號量和管程都是作業系統用於同步提供的兩種方法,我們將結合生產者與消費者模型對此進行學習。為了提高系統的併發性,我們引入了多程序,多執行緒,但是這樣子帶來了資源競爭,也就是多個程式同時訪問乙個共享資源而引發的一系列問題,因此我們需要協調多執行緒對與共享資源的訪問,在任意時刻保證只能有乙個執行緒執行臨...

POSIX訊號量 生產者消費者模型

今天我們來寫乙個基於固定大小的環形佇列的生產者消費者模型。首先來畫圖說明一下 這是乙個環形佇列的生產者消費者模型。生產者用p表示,消費者用c表示。這個環形佇列的每一段空間我們用semblank表示,放入的內容我們用semdata表示。生產者首先要申請乙個semblank,然後放入semdata。消費...

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

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