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

2021-07-08 22:37:04 字數 1440 閱讀 7411

該程式為linux訊號量機制實現程式,主要模擬了一般的生產者-消費者問題。(生產者-消費者問題是乙個經典的程序同步問題,該問題最早由dijkstra提出,用以演示他提出的訊號量機制。在同乙個程序位址空間內執行的兩個執行緒。生產者執行緒生產物品,然後將物品放置在乙個空緩衝區中供消費者執行緒消費。消費者執行緒從緩衝區中獲得物品,然後釋放緩衝區。當生產者執行緒生產物品時,如果沒有空緩衝區可用,那麼生產者執行緒必須等待消費者執行緒釋放出乙個空緩衝區。當消費者執行緒消費物品時,如果沒有已用的緩衝區,那麼消費者執行緒將被阻塞,直到新的物品被生產出來。

#include #include #include #include #include #include #define n 5   // 消費者或者生產者的數目

#define m 10 // 緩衝數目

//int m=10;

int in = 0; // 生產者放置產品的位置

int out = 0; // 消費者取產品的位置

int buff[m] = ; // 緩衝初始化為0,開始時沒有產品

sem_t empty_sem; // 同步訊號量,當滿了時阻止生產者放產品

sem_t full_sem; // 同步訊號量,當沒產品時阻止消費者消費

pthread_mutex_t mutex; // 互斥訊號量,一次只有乙個執行緒訪問緩衝

int product_id = 0; //生產者id

int prochase_id = 0; //消費者id

//訊號處理函式

void handlesignal(int signo)

/* 列印緩衝情況 */

void print()

/* 生產者方法 */

void *product() }

/* 消費者方法 */

void *prochase() }

int main()

// 初始化同步訊號量

int ini1 = sem_init(&empty_sem, 0, m);//產品佇列緩衝同步

int ini2 = sem_init(&full_sem, 0, 0);//執行緒執行同步

if(ini1 && ini2 != 0)

//初始化互斥訊號量

int ini3 = pthread_mutex_init(&mutex, null);

if(ini3 != 0)

// 建立n個生產者執行緒

for(i = 0; i < n; i++)

}//建立n個消費者執行緒

for(i = 0; i < n; i++)

}//等待執行緒銷毀

for(i = 0; i < n; i++)

exit(0);

}

這個是因為pthread並非linux系統的預設庫,編譯時注意加上-lpthread引數,以呼叫鏈結庫

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

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

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

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

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

訊號量 1 定義訊號量 sem t semaphore 定義乙個名為semaphore的訊號量 2 初始化訊號量 int sem init sem t sem,int pshared,unsigned int value 引數 sem t sem 要初始化的訊號量 int pshared pshar...