多執行緒 互斥量 訊號量和條件變數

2021-10-05 22:45:50 字數 1554 閱讀 9770

通常用於互斥訪問:

pthread_mutex_t m_mutex;

pthread_mutex_intit

(&m_mutex,

null);

pthread_mutex_lock

(&m_mutex);.

..pthread_mutex_unlock

(&m_mutex)

;pthread_mutex_destory

(&m_mutex)

;

sem_t m_sem;

sem_init

(&m_sem,0,

0);sem_wait

(&m_sem)

;//down

sem_post

(&m_sem)

;//up

sem_destroy

(&m_sem)

;

重點函式:

pthread_cond_wait

(&m_cond,

&m_mutex)

;

pthread_cond_wait 為什麼需要傳遞 mutex 引數?

該函式具體的流程是:

為了保證原子性:喚醒者在呼叫pthread_cond_broadcast或pthread_cond_signal喚醒等待者之前也必須對相同的mutex加鎖。

滿足上述條件後,如果乙個等待事件a發生在喚醒事件b之前,那麼a也同樣在b之前獲得了mutex,那a在被加入喚醒佇列之前b都無法進入喚醒呼叫,因此保證了b一定能夠喚醒a;試想,如果a、b之間沒有mutex來同步,雖然b在a之後發生,但是可能b喚醒時a尚未被加入到喚醒佇列,這便是所謂的喚醒丟失。

pthread_mutex_t m_mutex;

pthread_cond_t m_cond;

pthread_cond_init

(&m_cond,

null);

pthread_mutex_lock

(&m_mutex)

;pthread_cond_wait

(&m_cond,

&m_mutex)

;pthread_mutex_unlock

(&m_mutex)

;pthread_mutex_lock

(&m_mutex)

;pthread_cond_siganl

(&m_cond)

;pthread_mutex_unlock

(&m_mutex)

;pthread_mutex_lock

(&m_mutex)

;pthread_cond_broadcast

(&m_cond)

;pthread_mutex_unlock

(&m_mutex)

;pthread_cond_destroy

(&m_cond)

;pthread_mutex_destroy

(&m_mutex)

;

訊號量和互斥量

1.互斥量用於執行緒的互斥,訊號線用於執行緒的同步。這是互斥量和訊號量的根本區別,也就是互斥和同步之間的區別。互斥 是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。同步 是指在互斥的基礎上 大多數情況 通過其它機制實現訪問者對資...

訊號量 互斥量

lonelycatcher if only as first.來自 訊號量用在多執行緒多工同步的,乙個執行緒完成了某乙個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作 大家都在semtake的時候,就阻塞在 而互斥鎖是用在多執行緒多工互斥的,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法...

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

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