2016-04-18 5 views
1

私はthe completely fair solution to the Readers/Writers problemを経由していましたが、ロックを解除する順序はわかりにくいようです。 serviceQueueロックを解放する順序と、reader()機能のロックをreadCountAccess解除する順序を入れ替えることができるかどうかを知りたいと思います。順序が重要でない場合、この方法でロックを解放するのは逆の直観的なようです。しかし、逆の順序でロックを解除する際に何が間違っているのかは分かりません(最初はreadCountAccess、その後は、次にserviceQueueロック)。リーダ/ライターの同期 - 公正なバージョンのロックを解除する順

答えて

1

これはおそらく、より広範なロック(この場合はserviceQueue)を解放することを正当化できる日からの残りの部分です。狭いロック。

それぞれの取得または解放に1時間単位がかかるとします。それぞれの操作には0単位が必要です。リーダは時間0でリーダカウンタを増やしただけで、サービス待機キューには次のリーダーが並んでいます。

  • readCountAccess場合は、最初にリリースされていないとserviceQueue第二は、次の読者は一度以前よりもserviceQueueミューテックスを取得できた3.したがって、それがリードロック登録式で行うことができる最も早い時刻6.でありますここで恩恵を受けるパーティーは他の読者が終了を待っていることになりますが、それはあまり重要ではありません。resourceAccessもリリースできないはずです。

  • serviceQueueは、次の読者がこれはそれが早けれのように読み取りロック登録セレモニーで行うことができることを意味し、時間2で早くもserviceQueue mutexを獲得でき、第1、第readCountAccess二解放される一方場合時間5.

が、私はまだかかわらず、左右対称の方式を使用してロックを解除することを好むだろう - それはあまりエラーが発生しやすいですが、それは、より広範な認識を持っており、現在はそれがバージョンよりもどのような方法でさらに悪い立証責任上記の疑いの肩の上に横たわるでしょう。

関連する問題