當併發執行緒競爭使用同乙個資源時,它們互相之間會發生衝突,我們可以把這種情況簡單描述如下:兩個或更多的執行緒在它們的執行過程中需要訪問乙個資源,每個程序並不知道其他執行緒的存在,並且每乙個執行緒也不受其他執行緒的影響。每個執行緒都不影響它所使用的資源的狀態,這類資源包括i/o裝置、儲存器、處理器時間和時鐘。
競爭執行緒間沒有任何資訊交換,但是乙個執行緒的執行可能會影響到競爭執行緒的行為。特別是如果兩個執行緒都期望訪問同乙個資源,作業系統把這個資源分配給乙個執行緒,另乙個就必須等待。因此,被拒絕訪問的執行緒速度就會變慢。一種極端情況是,被阻塞的執行緒永遠不能訪問這個資源,因此一直不能成功地終止。
競爭執行緒面臨的首先是互斥的要求。假設兩個或者更多的執行緒需要訪問乙個不可共享的資源,如印表機。在執行過程中,每個執行緒都給該i/o裝置發命令,接收狀態資訊,傳送資料和接收資料。我們把這類資源稱為臨界資源,使用臨界資源的那一部分**稱為程式的臨界區。一次只允許有乙個程式在臨界區中,這一點是非常重要的。
由於不清楚詳細要求,我們不能僅僅通過作業系統來理解和增強這個限制。這就需要我們程式設計師具備較強的處理併發的能力。
例如在印表機的例子中,我們希望任何乙個執行緒在列印整個檔案時都擁有印表機的控制權,否則在列印結果中就會穿插著來自競爭資源的列印內容。
實施互斥產生了兩個額外的控制問題。乙個是死鎖。乙個是飢餓。要解決好這兩個問題,就需要乙個好的互斥演算法,既要使得多執行緒程式高效執行,又要防止死鎖的發生。
假設有n
nn個執行緒併發執行,每個執行緒包括
在某些資源rara
ra上操作的臨界區。
不涉及訪問資源rara
ra的額外**。
因為所有的執行緒都需要訪問同一資源rara
ra,因此保證在同一時刻只有乙個執行緒在臨界區是很重要的。為實現互斥,需要兩個函式:ent
ercr
itic
al
entercritical
enterc
riti
cal和exi
tcri
tica
lexitcritical
exitcr
itic
al。每個函式的引數都是競爭使用的資源標識,如果另外乙個執行緒在臨界區中,那麼任何試圖進入關於同乙個資源的臨界區的執行緒都必須等待。同時要注意:臨界區要盡可能的小,一層一層的封裝會使得臨界區變大;同時**過於粗糙也會使臨界區變大。下面是偽**,給出了互斥機制。
/*process*/
void p(ra)
}
dij
kstr
adijkstra
dijkst
ra提出了兩個執行緒互斥的演算法,由德國數學家dek
ke
rdekker
dekker
實現。它避免了執行緒互相謙讓的問題,演算法效率可以得到提高,主要用於生產者-消費者模式。下面是具體實現**(c++)
enum blockmodel
;bool queue_mutex[2];
int queue_turn;
void dekker_in(bool mutex[2],int &turn,blockmodel type)
mutex[type]=true;
}sleep(1);
}}void dekker_out(bool mutex[2],int &turn,blockmodel type)
//生產者呼叫例項(消費者只需要把producer換成consumer)
dekker_in(queue_mutex,queue_turn,producer);
/*臨界區操作
*/dekker_out(queue_mutex,queue_turn,producer);
當然,對於互斥演算法,各類程式設計平台都做了封裝的工作,可以直接拿來用,但是要追求高效率、高魯棒性的程式,像這樣的實現**還是很有價值的。但是一般來說dek
ke
rdekker
dekker
演算法僅能用來處理「簡單」的情況,如果併發的執行緒多於兩個,或者共享的資源較多,流程邏輯較為複雜,那還是需要更加高階的多執行緒互斥的演算法。
[1] 作業系統——精髓與設計原理 【美】william stallings 編著 陳渝 譯
多執行緒 執行緒互斥之synchronized 詳解
定義 執行緒互斥是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。我們都知道保證執行緒完整執行。則需要對其加鎖。使用synchronized關鍵字。在這裡鎖的物件理論上可以為任何物件。塊同步 public void output ...
多執行緒同步之互斥物件
一 互斥物件屬於核心物件,它能夠確保執行緒擁有對單個資源的互斥訪問權。互斥物件包含乙個使用數量 乙個執行緒id 乙個計數器 其中id標識了當前哪個執行緒擁有互斥物件,計數器用於表明該執行緒擁有互斥物件的次數。當該執行緒擁有互斥物件的次數為0時,表明該執行緒釋放了互斥物件的所有權,互斥物件處於有訊號狀...
多執行緒同步之互斥鎖
對於多執行緒程式來說,同步是指在一定的時間內只允許某乙個執行緒訪問某個資源 而在 此時間內,不允許其他的執行緒訪問該資源。同步資源的方式 互斥鎖 條件變數 讀寫鎖 訊號量。下面介紹下互斥鎖 將互斥鎖想象成乙個只能容納乙個人的洗手間,當某個人進入洗手間的時候,可以從 裡面將洗手間鎖上,其他人只能在互斥...