ace condition類屬
ace condition類屬(條件變數)提供風格與互斥體、讀者/作者鎖和計數訊號量不同的鎖定機制。當持有鎖的執行緒在臨界區執行**時,這三種機制讓協作執行緒進行等待。相反,條件變數通常被乙個執行緒用於使自己等待,直到乙個涉及共享資料的條件表示式到達特定的狀態。當另外的協作執行緒指示共享資料的狀態已發生變化,排程器就喚醒乙個在該條件變數上掛起的執行緒。於是新喚醒的執行緒重新對它的條件表示式進行求值,如果共享資料已到達合適狀態,就恢復處理。
ace執行緒庫提供乙個叫作condition的類來可移植地在c++包裝類中實現條件變數語義。定義方式如下:
ace_thread_mutex mutex;
ace_conditioncond(mutex);
該物件有兩個常用方法。
signal()
向使用該條件變數的其它執行緒傳送滿足條件訊號。
wait()
查詢是否滿足條件,如果滿足,則繼續往下執行;如果不滿足條件,主線程就等待在此條件變數上。條件變數隨即自動釋放互斥體,並使主線程進入睡眠。
條件變數總是與互斥體一起使用。這是一種可如下描述的一般模式:
while( expression not true ) wait on condition variable;
條件變數不是用於互斥,往往用於執行緒間的協作,下面例子演示了通過條件變數實現執行緒協作。
#include
"ace/thread.h"
#include
"ace/synch.h"
#include
using
namespace std;
ace_thread_mutex mutex;
ace_conditioncond(mutex);
void* worker(void *arg)
void* eater(void *arg)
int main(int argc, char *argv)
這個例子中,首先建立了乙個生產者執行緒worker和乙個消費者執行緒eater,消費者執行緒執行比生產者快,兩個執行緒不加限制併發執行會導致先消費,後生產的情況(只是加互斥鎖也不能很好的解決,以為無法保證生產者一定先獲得互斥體)。所以這裡通過條件變數的通知方式保證執行緒的順序執行:
消費者執行緒獲取互斥體,等待條件滿足(生產者生產了食品)。同時釋放互斥體,進入休眠狀態。
生產者獲取互斥體(雖然是消費者先獲取的互斥體,但消費者呼叫的wait函式會釋放消費者的互斥體),生產商品後,通過條件變數傳送訊號(呼叫signal
函式)通知消費者生產完成,結束生產過程,釋放互斥體。
消費者收到訊號後,重新獲取互斥體,完成消費過程。
使用條件變數的注意事項:
條件變數必須和互斥體一起使用,也就是說使用前必須加鎖(呼叫互斥體acquire函式),使用完後需釋放互斥體。
條件變數中的wait()和signal()成對使用的話,必須保證wait()函式在signal()之前執行,這樣才能保證wait()能收到條件滿足通知,不至於一直等待下去,形成死鎖(worker執行緒中的第一句話就是起的這個作用)。
ACE執行緒管理機制 併發控制 3
ace condition類屬 ace condition類屬 條件變數 提供風格與互斥體 讀者 作者鎖和計數訊號量不同的鎖定機制。當持有鎖的執行緒在臨界區執行 時,這三種機制讓協作執行緒進行等待。相反,條件變數通常被乙個執行緒用於使自己等待,直到乙個涉及共享資料的條件表示式到達特定的狀態。當另外的...
ACE執行緒管理機制 併發控制 3
ace condition類屬 ace condition類屬 條件變數 提供風格與互斥體 讀者 作者鎖和計數訊號量不同的鎖定機制。當持有鎖的執行緒在臨界區執行 時,這三種機制讓協作執行緒進行等待。相反,條件變數通常被乙個執行緒用於使自己等待,直到乙個涉及共享資料的條件表示式到達特定的狀態。當另外的...
ACE執行緒管理機制 併發控制 3
ace condition類屬 ace condition類屬 條件變數 提供風格與互斥體 讀者 作者鎖和計數訊號量不同的鎖定機制。當持有鎖的執行緒在臨界區執行 時,這三種機制讓協作執行緒進行等待 相反,條件變數通常被乙個執行緒用於使自己等待 直到乙個涉及共享資料的條件表示式到達特定的狀態。當另外的...