lamport麵包店演算法簡介

2021-09-16 12:39:21 字數 1242 閱讀 8363

lamport麵包店演算法是解決多個執行緒併發訪問乙個共享的單使用者資源的互斥問題的演算法。由萊斯利·蘭波特發明。

lamport把這個併發控制演算法非常直觀地模擬為顧客去麵包店採購。

這個模擬中的顧客就相當於執行緒,而入店購貨就是進入臨界區獨佔訪問該共享資源。由於計算機實現的特點,存在兩個執行緒獲得相同的簽到號碼的情況,這是因為兩個執行緒幾乎同時申請排隊的簽到號碼,讀取已經發出去的簽到號碼情況,這兩個執行緒讀到的資料是完全一樣的,然後各自在讀到的資料上找到最大值,再加1作為自己的排隊簽到號碼。

為此,該演算法規定如果兩個執行緒的排隊簽到號碼相等,則執行緒id號較小的具有優先權。

lamport時間戳原理如下:

private void processrevcmsg(message m) throws interruptedexception 

trytoacquireresource();

}private void trytoacquireresource()

message mymessage = reqmap.get(pid).get(0);

int acceptcount = 1;

// rule 5 當滿足以下兩個條件時,程序a會被分配該資源:a)有乙個(tm:a)的請求,按照=>關係排在佇列第一位;b)a接收到了乙個時間戳大於tm的來自所有其他程序的訊息

// condition (ii) of rule 5

// a接收到了乙個來自所有其他程序的訊息,而且時間戳大於tm

for (map.entryentry : lastsendmap.entryset())

if (isfirstearlier(mymessage, entry.getvalue())) else

}if (!coordinator.hasacceptedall(acceptcount))

// condition (i) of rule 5

// 有乙個tm:a的請求,按照=>關係排在佇列第一位

for (map.entry> entry : reqmap.entryset()) }}

// remove this request message

final message firstmsg = reqmap.get(pid).remove(0);

workingpool.execute(new runnable() catch (interruptedexception e)

}});

}}

邏輯時鐘 邏輯時鐘,又稱Lamport演算法

時間同步不需要絕對的精確時間,如果程序間沒有相互作用,就不需要時鐘同步並且程序所關心的不是說明時間做什麼工作,它們所關心的是事件發生的順序 時間戳 timestamp 在分布式系統中,每一台機器都設定乙個整型變數作為時鐘,當a發生時,用這個時鐘的值作為a的timestamp,記為c a 這樣有 if...

分麵包問題

include include define inf 1 30 using namespace std int ways 21 21 21 ways w h m 表示的是寬為w,高為h,切了m刀之後的,最大正方的最小面積 而我們想要求的,就是 ways w h m 1 邊界條件是 w h m,因為 ...

麵包板簡潔

我們所說的電路麵包板通常是指免焊麵包板。這些都是製作臨時電路和測試原型的最好元件,他們是絕對不需要焊接的。測試原型,一種通過建立初始模型來測試想法的過程,而這個模型由其他形式開發或複製,這是麵包板最廣泛的用途。如果你不確定乙個電路在給定引數的設定下會如何反應,建立乙個測試原型去檢測它是最好的。對於那...