訊號量實現環形buff下多生產者多消費者模型

2021-07-12 04:28:33 字數 1170 閱讀 9691

posix下定義了乙個semaphore,他和systemv版本下的sem很像,而這個多用於執行緒,它的單位是訊號量,而sem的單位是訊號量集。

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

int sem_destroy(sem_t *sem);

int sem_wait(sem_t *sem);

int sem_trywait(sem_t *sem);

int sem_post(sem_t *sem);

其中wait就是p操作,post則是v操作。

環形buff的設計思想:

用乙個大小為buff_max的陣列,生產者在前,消費者在後,生產者的pro_sem初始化buff_max,

消費者cons_sem初始化為0,生產者生產則pro_sem執行p操作cons_sem執行v操作,反之消費者消費cons_sem-1,而pro_sem+1,陣列下表%buff_max這樣陣列就相當於乙個環形buuf了。

1 #include2 #include3 #include4 #define pro_buff 20

5 #define cons_buff 0

6 int my_buff[pro_buff];

7 sem_t productor_sem;

8 sem_t consumer_sem;

9 sem_t cons_comm;

10 sem_t pro_comm;

11 12 void*productor(void *arg)

13 28 }

29 void*consumer(void *arg)

30 44 

45 }

46 47 

48 int main()

49 62     for(i=1;i<4;i++)

63     

66     pthread_join(productor1_id,null);

67     pthread_join(consumer1_id,null);

68 }

在消費者和消費者之間新增一把鎖,生產者生產者之間新增一把鎖,目的是為了它們之間的互斥關係。

本文出自 「痕跡」 部落格,請務必保留此出處

Linux下的訊號量

linux下的訊號量本身就是臨界資源,所以pv操作都是原子操作。下面是實現二元訊號量的 二元訊號量就是互斥鎖。訊號量 中的semop函式是進行pv操作的核心函式,semop的函式原型為 int semop int semid,struct sembuf sops,unsigned nsops 第乙個...

linux下訊號量詳解

訊號量 訊號量實際上就是乙個計數器,用於控制程序或執行緒對臨界資源的同步與互斥,對訊號量的操作是乙個原子操作 也就是在乙個程序或執行緒訪問它時,其它的程序或執行緒不能同時訪問它來打斷前乙個程序或執行緒的操作 它的原理就是在乙個程序或執行緒過來時,先訪問訊號量,如果這個訊號量大於0,則讓計數 1,然後...

訊號量實現讀寫鎖

一般的讀寫鎖 一般的讀寫鎖都是一開始對鎖分配max resource個資源,其中寫操作的時候會一次性占用 max resource個資源,而讀操作的時候就只會占用乙個資源。這樣子會出現乙個問題就是 如果在當前資源的數目不為max resource的時候,那麼總是不能進行寫操作,只能是進行 讀操作,如...