2016-04-18 45 views
1

我正在通過the completely fair solution to the Readers/Writers problem,釋放鎖的順序似乎讓我感到困惑。我想知道我們是否可以在reader()函數中交換釋放serviceQueue鎖和readCountAccess鎖的順序。如果順序無關緊要,以這種方式釋放鎖看起來是違反直覺的。但我沒有看到以相反的順序釋放鎖定有什麼問題(首先,readCountAccess,然後,然後serviceQueue鎖定)。讀者/作家同步 - 釋放鎖公平版本的順序

回答

1

這可能是一個剩餘時間,如果這不會影響正確性,那麼您可以首先釋放更大的鎖(在這種情況下爲serviceQueue),因爲另一個線程可以在釋放更多時立即繼續獲取它窄鎖。假設每個獲取或釋放需要1個時間單位,每個其他操作需要0個時間單位,讀者只是在時間0時遞增讀取器計數器,並且在服務等待隊列中還有另一個讀取器在線。

  • 如果readCountAccess被釋放第一和serviceQueue秒,接下來的讀者可能會不早於時間獲取serviceQueue互斥。因此它可以與讀鎖註冊儀式來完成最早是在時間6。這裏的受益方將是其他讀者等待退出,並且他們不那麼重要,因爲他們不應該也能夠發佈resourceAccess(因爲我們原來的讀者已經註冊了)。

  • 如果另一方面serviceQueue被釋放第一和readCountAccess秒,接下來的讀者可以在時間2早獲得serviceQueue互斥這意味着它可以與讀鎖註冊儀式,早在做時間5

我還是更喜歡使用對稱方案雖然解鎖 - 這是容易出錯少,它具有更廣泛的認識,並舉證,目前以任何方式更糟糕的是比版本以上將落在懷疑者的肩上。