C 多執行緒中使用條件變數示例

2021-10-13 22:24:36 字數 1834 閱讀 8838

換一下    std::unique_locklck(mtx);加鎖的位置。

發現在多個執行緒使用同乙個互斥鎖的時候,如果在while(flag)之外加鎖,則某個獲取鎖的執行緒將會一次執行完畢,然後釋放鎖,供其他執行緒搶占。其他執行緒一旦持有鎖,也是直接完畢之後才釋放鎖。

如果把鎖加到while(flag)裡面,則互斥鎖mtx的影響範圍僅在while(flag)後面的之間,當某個執行緒拿到鎖並進行while(flag)之後,在執行到while(flag)的}時刻,mtx被該執行緒釋放,此後,其他執行緒搶占mtx,誰搶到,誰占用,並執行一次cv.wait(lck);之後,直到while(flag)的}結束的位置這段**。

實際上,cv.wait(lck);這個函式呼叫有兩層含義:

(1)在某個正在執行的(也就是當前持有mtx鎖的)執行緒進入等待時,也就是while(!ready)成立時,該執行緒在進入cv.wait(lck)的時候,釋放lck這個鎖,供其他執行緒使用(如果其他執行緒此時被喚醒);

(2)當某個執行緒處於掛起狀態時,也就是被阻塞在cv.wait(lck)處時,說明該執行緒目前沒有持有lck這個鎖,它在等待這個鎖。如果某個時刻,某個執行緒執行了notify_all()類似的啟用函式,那麼所有等待lck這個鎖的執行緒開始搶占;當某乙個執行緒搶到了lck這個鎖的時候,該執行緒準備離開cv.wait(lck)這行**,此時在離開之前,該執行緒占用lck這個鎖,此時,其他的執行緒就處於等待狀態了,直到該執行緒釋放該鎖。那麼它是什麼時候釋放lck,這就要看上次顯式加鎖所在的位置,找到與它匹配的**段,也就是與之對應的},就是釋放鎖的時候。

至於驗證在某個恰當的時候,呼叫notify_all()或者設定ready = false,就不再測試了。可以將while(flag)執行的次數多一點,然後在while(flag)內部某個時刻呼叫stop,或者在while(flag)執行次數多的情況下,在main函式中呼叫stop();

條件變數 多執行緒

最近看 unix環境高階程式設計 多執行緒同步,看到他舉例說條件變數pthread cond t怎麼用,愣是沒有看懂,只好在網上找了份 跑了跑,才弄明白 cpp view plain copy include include include pthread mutex t mutex pthread...

c 多執行緒程式設計 條件變數

include stdafx.h include include include include include include include include include include include include include include include include using...

c 中使用多執行緒

using system using system.drawing using system.collections using system.componentmodel using system.windows.forms using system.data using system.threa...