zthread學習 例項十 執行緒間的協助(一)

2021-07-02 16:54:04 字數 2098 閱讀 7615

使用執行緒在同一時刻執行多個任務時,可以使用互斥鎖來同步多個任務,阻止乙個任務干擾另乙個任務的資源。也就是說,使用互斥鎖來保證同一時刻只允許乙個任務訪問共享資源。

執行緒間協作:多個執行緒一起工作來共同解決某個問題(問題的某一部分必須在另一部分被解決之前解決完畢)。

zthread庫中使用 互斥鎖 並允許 掛起 的基類condition,可以通過wait()掛起乙個任務(不是忙等待),當外部狀態發生改變時,通過signal()或broadcast()來喚醒這個任務。

wait()的工作方式:它會釋放被condition物件所控制的互斥鎖mutex(很關鍵),並且掛起執行緒。正因為會釋放被condition物件所控制的互斥鎖mutex,這就意味著該mutex可以被其他執行緒獲得,使當前執行緒掛起(等待其他執行緒的某個作務完成),並把執行控制權交給其他執行緒。

下面是乙個關於執行緒協助的簡單例子:乙個執行緒給car上蠟,乙個執行緒給car拋光。拋光執行緒在上蠟完成之前不能進行工作、上蠟執行緒在car可以再上蠟外套之前必須等到拋光執行緒完成:

[cpp]view plain

copy

#include 

#include "stdafx.h"

#include "zthread/mutex.h"

#include "zthread/guard.h"

#include "zthread/condition.h"

#include "zthread/countedptr.h"

#include 

using

namespace

zthread;  

using

namespace

std;  

class

car  

void

waxed()        

//上蠟

void

buffed()           

//拋光

//void

waitforwaxing()    

//等待上蠟

void

waitforbuffing()   

//等待拋光

private

:  mutex lock;  

condition condition;        //用於執行緒間協作

bool

biswaxon;           

//是否上蠟

};  

//上蠟任務

class

waxon : 

public

runnable  

void

run()  

}  catch

(interrupted_exception& e)  

}  private

:  countedptrpcar;  

};  

//拋光任務

class

waxoff : 

public

runnable  

void

run()  

}  catch

(interrupted_exception& e)  

}  private

:  countedptrpcar;  

};  

intmain()  

catch

(synchronization_exception& e)  

return

0;  

}    

**中,wait()的呼叫被置於乙個while迴圈中,用這個迴圈來檢查相關條件。主要基於兩個原因:

1、很可能當某個執行緒得乙個訊號signal()時,其他一些條件可能已經改變了,但這些條件在這裡與呼叫wait()的原因無關。如果有這種情況,該執行緒在其相關的條件改變這前將再一次被掛起。

2、在該執行緒從其wait()函式中醒來之時,可能另外某個任務改變了一些條件,因此這個執行緒就不能或者沒興趣在此時執行其操作了。於是再次呼叫wait()重新掛起。

——基於以上這兩個原因在呼叫wait()時總會出現,故總是將wait()置於while迴圈中來測試與執行緒相關的條件(如本例中的 bool biswaxon)。

多執行緒學習 十 執行緒狀態 守護執行緒

守護執行緒 執行緒分為守護執行緒和使用者執行緒,當程式中沒有使用者執行緒時,jvm會退出.方法 內容void setdaemon boolean on 將該執行緒標記為守護執行緒或使用者執行緒 boolean isdeamon 測試該執行緒是否為守護執行緒。void setdaemon boolea...

zthread學習 例項七 執行緒本地儲存

消除任務在共享資源上發生衝突問題的第二種方法是 消除共享變數,對使用同乙個變數的不同執行緒,可以為同乙個變數建立不同的儲存單元。因此,如果有5個執行緒使用乙個含有變數x的物件,執行緒本地儲存會自動為變數產生5個不同的儲存單元。cpp view plain copy include stdafx.h ...

linux下的C語言開發(十) 執行緒等待

和多程序一樣,多執行緒也有自己的等待函式。這個等待函式就是pthread join函式。那麼這個函式有什麼用呢?我們其實可以用它來等待執行緒執行結束。include include include include void func 1 void args void func 2 void args...