ロックの一貫性のない状態


7

私はマルチプロセッサプログラミングのアートを読んでおり、一貫性のないロックの概念を理解しようとしています。具体的には、37ページで、一貫性のないロックの定義2.8.1と補題2.8.1は私には明確ではありません。

定義2.8.1。Lockオブジェクトの状態sは、一部のスレッドがクリティカルセクションにあるグローバル状態では一貫していませんが、ロック状態は、クリティカルセクションにスレッドがない、またはスレッドが開始しようとしているグローバル状態と互換性があります。

補題2.8.1デッドロックのないロックの実装が不整合な状態になることはありません。

証明:

Lockオブジェクトが一貫性のない状態sであり、クリティカルセクションにスレッドが存在しないか、スレッドが開始しようとしているとします。スレッドBがクリティカルセクションに入ろうとすると、実装にデッドロックがないため、スレッドBは最終的に成功する必要があります。

Lockオブジェクトが不整合な状態sにあるとします。ここで、Aはクリティカルセクションにあります。スレッドBがクリティカルセクションに入ろうとする場合、スレッドBはAが出るまでブロックする必要があります。BはAがクリティカルセクションにあるかどうかを判断できないため、矛盾があります。

わからないこと:

  • 一貫性がないということは、スレッドがクリティカルセクションにある場合、他のスレッドがそれについて知ることができないということだけを意味しますか?
  • 補題証明の矛盾は何ですか?スレッドAがクリティカルセクションにあり、ロックが不整合な状態にあるとします。別のスレッドがロックの状態を上書きして取得するのを阻止するものは何ですか?

彼らの「デッドロックフリー」の定義を述べることができますか?
vzn 2014

回答:


1
  • ここで「一貫性がない」とは、基本的に、内部実装がスレッドのアクティブ化とロックの可用性の現実を反映していないことを意味します。別名「欠陥」。つまり、スレッドロックとして正しく機能していません。たとえば、ロックは「アクティブ」を示している可能性がありますが、ロックを取得したスレッドはありません。または、ロックは「非アクティブ」を示していますが、一部のスレッドがロックを取得しています。

  • 矛盾は、「デッドロックフリー」によれば、ロックはそれを要求する少なくともいくつかのスレッドによって最終的に取得されるということです。しかし、一貫性のない状態の場合、一部のスレッドは実行されていますが、ロックは何もロックされていないことを示しています。ただし、新しいスレッドは(Aと同時に実行せずに)ロックを取得できません。

本の説明とよく一致するオンラインref [1]のしわ/微妙さに注意してください(同じ著者)。

プログラムは、使用する各ロックがデッドロックなしのプロパティを満たしている場合でも、デッドロックになる可能性があることに注意してください。たとえば、ロック0と1を共有するスレッドAとBについて考えてみましょう。最初に、Aが0を取得し、Bが1を取得します。次に、Aが1を取得しようとし、Bが0を取得しようとします。ロックを解除するには

[1] マルチプロセッサの同期と並行データ構造モーリスヘルリー/ニルシャビット


「(Aと同時に実行しないで)」:定義のどの部分がこれを除外しますか?Qが示唆するように、Bにロックを与え、それらを同時に実行させます。理由は、これはしなければならないデッドロックが発生しません。
Patrick 14

率直に言って、詳細に調べれば、彼らの証明はいくぶん循環的に聞こえますが、「デッドロックなし」の一部の定義では機能する可能性があります(ただし、特に不明確/あいまいであると思われる彼らの定義ではない可能性があります)。
vzn 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.