1. 程式人生 > >The Little Book of Semaphores 訊號量小書 第六章 不那麼經典的問題 6.1 搜尋-插入-刪除問題

The Little Book of Semaphores 訊號量小書 第六章 不那麼經典的問題 6.1 搜尋-插入-刪除問題

第六章 不那麼經典的問題

6.1 搜尋-插入-刪除問題

這個是來自安德魯斯的併發程式設計[1]。

三種執行緒共享對單鏈表的訪問:搜尋者,插入者和刪除者。 搜尋者只檢查列表; 因此它們可以彼此同時執行。 插入者將新項新增到列表的末尾; 插入必須是互斥的,以防止兩個插入者幾乎同時插入新項。 但是,一個插入可以與任意數量的搜尋並行進行。 最後,刪除者從列表中的任何位置刪除專案。每次最多隻能有一個刪除程序可以訪問列表,並且刪除還必須與搜尋和插入互斥。

思考:難題:編寫搜尋者、插入者和刪除者的程式碼,強制執行這種三元分類的互斥。

6.1.1 搜尋-插入-刪除提示

insertMutex確保每次只有一個插入者位於臨界區。 noSearcher和noInserter表示(驚訝)他們的臨界區沒有搜尋者和插入者; 刪除者需要持有這兩個才能進入。

searchSwitch和insertSwitch被搜尋者和插入者用於排除刪除者。

6.1.2 搜尋-插入-刪除方案

這是我的方案:

搜尋者唯一需要擔心的是刪除者。 第一個進入的搜尋者獲取noSearcher; 最後一個出去的搜尋者釋放它。

類似地,第一個插入器獲取noInserter,最後一個出去的插入器釋放它。 由於搜尋者和插入者競爭不同的訊號量,所以它們可以同時處於臨界區。 但insertMutex確保一次只有一個插入器在房間中。

由於刪除器同時包含noSearcher和noInserter,因此可以保證獨佔訪問。 當然,每當我們看到一個執行緒持有多個訊號量時,我們需要檢查死鎖。 通過嘗試一些場景,您應該能夠說服自己這個解決方案是無死鎖的。

另一方面,像許多分類排除問題一樣,這個問題容易發生餓死。 正如我們在讀者-寫者問題(Readers-Writers)中看到的那樣,我們有時可以通過根據應用程式特定的標準優先考慮一類執行緒來緩解此問題。 但總的來說,很難編寫一個避免餓死的有效解決方案(允許最大程度的併發性)。