多執行緒互斥之Dekker演算法

2021-08-08 21:11:19 字數 2093 閱讀 7087

當併發執行緒競爭使用同乙個資源時,它們互相之間會發生衝突,我們可以把這種情況簡單描述如下:兩個或更多的執行緒在它們的執行過程中需要訪問乙個資源,每個程序並不知道其他執行緒的存在,並且每乙個執行緒也不受其他執行緒的影響。每個執行緒都不影響它所使用的資源的狀態,這類資源包括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時,表明該執行緒釋放了互斥物件的所有權,互斥物件處於有訊號狀...

多執行緒同步之互斥鎖

對於多執行緒程式來說,同步是指在一定的時間內只允許某乙個執行緒訪問某個資源 而在 此時間內,不允許其他的執行緒訪問該資源。同步資源的方式 互斥鎖 條件變數 讀寫鎖 訊號量。下面介紹下互斥鎖 將互斥鎖想象成乙個只能容納乙個人的洗手間,當某個人進入洗手間的時候,可以從 裡面將洗手間鎖上,其他人只能在互斥...