執行緒同步之條件變數和訊號量(生產者消費者模型)

2021-09-08 12:55:38 字數 3311 閱讀 2613

#includeint pthread_cond_init(pthread_cond_t  *restrict cond,  const pthread_condattr_t *restrict attr);

int pthread_cond_destroy(pthread_cond_t *cond);

#includeint pthread_cond_wait( pthread_cond_t  *restrict  cond,  pthread_mutex_t  *restrict  mutex);

int pthread_cond_timewait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict tsptr);

#includeint pthread_cond_signal(pthread_cond_t  *cond);

int pthread_cond_broadcast(pthread_cond_t *cond);

1 #include2 #include3 #include4 #include5 #include6 

7 pthread_mutex_t mutex = pthread_mutex_initializer;

8 pthread_cond_t has_product = pthread_cond_initializer;

9 10

11 typedef struct foodfood;

15 16 food* head = null;

17 18 void *product(void* arg)

19 35 return null;

36 }

37 38 void* consume(void* arg)

39 48

49 mp = head;

50 head = mp->next;

51 pthread_mutex_unlock(&mutex);

52 printf("consume : %d\n",mp->food);

53 free(mp);

54 sleep(rand()%5);

55 }

56 return null;

57 }

58 59 int main()

60 71 ret = pthread_create(&tid2,null,consume,null);

72 if(ret != 0)

73

77 78 pthread_join(tid1,null);

79 pthread_join(tid2,null);

80 81 return 0;

82 }

條件變數的優點主要應用函式:
sem_init函式

sem_destroy函式

sem_wait函式

sem_trywait函式

sem_timedwait函式

sem_post函式

訊號量基本操作:

sem_wait : 訊號量大於0,則訊號量 - - ,訊號量等於0,就會造成執行緒阻塞。

( 模擬 pthread_mutex_lock,我們可以認為初始化後的互斥鎖值為1,加鎖就減減,變為0。如果為鎖值為0,那麼執行緒阻塞。)

sem_post:將訊號量++,同時喚醒阻塞在訊號量上的執行緒(模擬pthread_mutex_unlock,我們可以認為解鎖加加,從0變為1,如果鎖的值為1,那麼說明這個鎖是解開的)

sem_init函式,初始化乙個訊號量

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

參1:sem訊號量

參2:pshared取0用於執行緒間;取非0(一般為1)用於程序間

參3:value指定訊號量初值

sem_destroy函式,銷毀乙個訊號量

int sem_destroy(sem_t *sem);sem_wait函式,給訊號量加鎖

int sem_wait(sem_t *sem);sem_post函式,給訊號量解鎖

int sem_post(sem_t *sem);sem_trywait函式,嘗試對訊號量加鎖

(與sem_wait的區別模擬lock和trylock)

int sem_trywait(sem_t *sem);sem_timedwait函式,限時嘗試對訊號量加鎖

int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

參2:abs_timeout採用的是絕對時間。

定時1秒:

time_t cur = time(null); 獲取當前時間。

struct timespec t; 定義timespec 結構體變數t

t.tv_sec = cur+1; 定時1秒

t.tv_nsec = t.tv_sec +100;

sem_timedwait(&sem, &t); 傳參

利用訊號量來實現生產者消費者模型
1 #include2 #include3 #include4 #include5 #include6 

執行緒同步 條件變數和訊號量

上一節提到了執行緒互斥和同步的概念,並且給出了兩種用於解決共享資源互斥的利器 互斥鎖和讀寫鎖。那麼本節將介紹兩種用於解決執行緒同步的概念 條件變數和訊號量。一.條件變數 1.基本概念 互斥鎖的缺點是它只有兩種狀態 鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補了互斥鎖...

執行緒同步之訊號量同步

linux中兩種基本的同步方法是訊號量和互斥量。這兩種方法很相似,而且它們可以相互通過對方來實現。現在有個圖書館,其能容納100人,現在有兩個執行緒a b,a執行緒執行 往圖書管理進入乙個人,b執行緒 從圖書館出來乙個人。那麼為了使得執行緒a在圖書館滿人的時候進入等待,而不是繼續往圖書館裡進人,使得...

執行緒同步之訊號量

什麼是訊號量 linux sem 訊號量是一種特殊的變數,訪問具有原子性,用於解決程序或執行緒間共享資源引發的同步問題。使用者態程序對 sem 訊號量可以有以下兩種操作 等待訊號量 當訊號量值為 0 時,程式等待 當訊號量值大於 0 時,訊號量減 1,程式繼續執行。傳送訊號量 將訊號量值加 1 通過...