作用: 用於實現執行緒間同步
條件變數通過提供執行緒等待,直到被喚醒的程序喚醒,從而實現執行緒同步;條件變數本身不具備條件判斷功能;也就是意味著什麼時候該等待,什麼時候該喚醒等待的執行緒,都需要使用者來控制;
流程需要和互斥鎖搭配使用, 使用者對臨界資源進行判斷, 如果需要那麼就要將其加入到等待佇列上, (判斷條件需要迴圈判斷, 因為先被喚醒的可能不是該執行緒, 那麼就可能發生錯誤), 不同的角色應該等待在不同的等待佇列上
原理當需要等待的時候, 將該執行緒放入到等待佇列上直到被喚醒。(提高效能)
變數型別: pthread_cond_t ;
int
pthread_cond_init
(pthread_cond_t *restrict cond,
const pthread_condattr_t *restrict attr)
;
cond: 所定義的條件變數
attr: 鎖的屬性, 不設定屬性可置為 null
int
pthread_cond_wait
(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex)
;
cond這個執行緒改在那個條件變數上等待
mutex這個條件變數是針對那個互斥鎖的(因為條件變數中等待佇列)
作用: 將該執行緒加入到該條件變數的等待佇列上, 直到被喚醒
int
pthread_cond_broadcast
(pthread_cond_t *cond)
;int
pthread_cond_signal
(pthread_cond_t *cond)
;
broadcast: 喚醒cond條件變數上的所有執行緒
signal: 喚醒cond條件變數等待佇列上的至少乙個執行緒
int
pthread_cond_destroy
(pthread_cond_t *cond)
銷毀這個以及初始化的條件變數
建立4個生產者執行緒負責生產, 乙個佇列倉庫, 倉庫滿了後生產者就不能繼續往裡面新增資料, 建立4個消費者執行緒, 如果倉庫的庫存為0, 那麼就不能在裡面去資料
**如下:
#include
#include
#include
#include
#define max_capacity 5
using
namespace std;
class
queue
~queue()
bool
push
(const
int& data)
_store.
push
(data)
;pthread_cond_signal
(&cond_consumer)
;pthread_mutex_unlock
(&mutexs)
;return
true;}
bool
pop(
int& data)
data = _store.
front()
; _store.
pop();
pthread_cond_signal
(&cond_preducer)
;pthread_mutex_unlock
(&mutexs)
;return
true;}
};void
*run_push
(void
* arg)
return
null;}
void
*run_pop
(void
* arg)
return
null;}
intmain()
for(
int i=
0;i<
4;i++
)for
(int i=
0;i<
4;i++
)for
(int i=
0;i<
4;i++
)return0;
}
執行結果:
條件變數實現執行緒同步
1 什麼是條件變數實現執行緒同步?假如我們的程式中有兩個執行緒,乙個是生產者執行緒,另乙個是消費者執行緒,生產者執行緒每隔一段時間把資料寫入到緩衝區buffer中,而消費者執行緒則每隔一段時間從buffer中取出資料,為了避免兩個執行緒讀寫混亂,我們讓生產線執行緒寫完後再通知消費者來讀資料,那麼則可...
執行緒同步 條件變數
當我們需要控制對記憶體資源的訪問的時候,可以用一種簡單的加鎖的方法來控制,即互斥鎖。但互斥鎖有乙個明顯的缺點,就是它只有兩個狀態 鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補來互斥鎖的不足。條件變數通常和互斥鎖一起使用。使用過程 1.呼叫pthread mutex ...
執行緒同步 條件變數
1.問題引入 互斥鎖問題,假設現在有兩個資源a和b,乙個執行緒先拿a再拿b,另乙個則相反,這樣導致的問題就是死鎖,即兩個執行緒無休止的互相等待 include include include include pthread mutex t g mtxa pthread mutex initializ...