執行緒同步之條件變數注意問題理解

2021-10-03 21:54:07 字數 1024 閱讀 4478

1、條件變數的作用:

條件變數與互斥量一起使用,個人理解,適用於共享資源需要滿足一定條件才需要執行的操作,如生產者-消費者模型中,生產者生產了資源並掛在公共區域後,消費者才能去消費這個資源;而單獨使用條件變數的情況是,共享資源不需要進行判斷;

2、生產者執行緒中,

2.1)pthread_mutex_unlock(),之後再 pthread_cond_singnal();

pthread_mutex_unlock();

pthread_cond_singnal();

分析:unlock之後,生產者執行緒失去鎖,此時,其他執行緒(沒有呼叫條件變數的執行緒)可以來搶鎖,假使鎖被沒有呼叫條件變數的執行緒搶到,改變了條件;此時生產者執行緒執行pthread_cond_singnal(),則消費者執行緒中pthread_cond_wait(),判斷條件又不滿足,會繼續阻塞。

2.2)pthread_cond_singnal()之後再pthread_mutex_unlock();

pthread_cond_singnal();

pthread_mutex_unlock();

分析:pthread_cond_singnal()呼叫之後,會首先喚醒pthread_cond_wait的執行緒,會避免1)中的競爭情況。

3、消費者執行緒中使用while

while(head==null)

pthread_cond_wait();

分析:之所以用while,是要進行兩次條件判斷,第一次,head==null,執行pthread_cond_wait(),阻塞等待signal,當signal來了之後,需要再次判斷head==null(因為存在2.1中的情況,此時可能head==null 仍然成立;存在2.2中的情況,因為pthread_cond_singnal()會喚醒至少乙個執行緒,但同時只能讓乙個執行緒執行操作(這個執行緒搶到了鎖),所以,使用while可以讓其他被喚醒的執行緒繼續阻塞)

執行緒同步之條件變數

程序空間中有乙個儲存量a,該程序空間內存在多個執行緒,這多個執行緒都會訪問到a,或讀或寫,為了保障每個執行緒當前讀到的是正確的a而不是別的執行緒正在修改過程中的a,我們在訪問a之前需要對a進行加鎖,使得我們在訪問a的時候別的執行緒禁止訪問a,這是互斥量鎖。或者允許多個執行緒同時讀a,這是讀寫鎖。還有...

執行緒同步之條件變數

1.條件變數是鎖嗎?不是鎖,但是條件變數能夠阻塞執行緒 條件變數需要和互斥鎖一起使用 互斥量 保護一塊共享資料 條件變數 引起阻塞 2.條件變數的兩個動作?當條件滿足,通知阻塞的執行緒執行緒開始工作 條件不滿足,阻塞執行緒 3.條件變數的型別 pthread cond t 4.主要函式 初始化乙個條...

執行緒同步之條件變數

條件變數不是鎖 名字上就沒有鎖字。但可以造成執行緒阻塞,通常與互斥鎖配合使用。1 條件變數 pthread cond t cond 2 函式 以下函式返回值均是成功返回0,失敗返回錯誤號 1 pthread cond init 動態初始化,配合phtread cond destroy一起使用。或者用...