2016-07-29 18 views
4

The boost documentation for upgradable and shared locksには、共有ロックが保持されている場合、他のスレッドがアップグレード可能なロックを1つしか取得できないことが示されています。そのため、共有ロックがアップグレード可能なロックと共に保持されているときに他のスレッドがアップグレード可能なロックを取得しようとすると、ブロックされます。共有ロックでアップグレード可能なロックを1つしか保持できないのはなぜですか?

複数のスレッドが1つ(または複数の共有ロック)とともにアップグレード可能なロックを取得するときに、いくつかのデッドロックの可能性がありますか?あるいは、これはちょうど論理的な必要条件なのです(そういうわけではありません)。

私は排他的にロック状態について話していないことに注意してください。アップグレード可能なロック状態のみ。アップグレード可能なロックが他の共有ロックと一緒に保持されている場合は、本質的にREADロックになります。それでは、2つのアップグレード可能なロックを一緒に保持できないのはなぜですか?

+0

@downvoterこの質問を改善するために私ができることを説明してください。 – Curious

+0

私はそれにふさわしいと尋ねたことを知るとすぐに質問を削除しますか? – Curious

+0

これは明らかな質問ですか?誰かが私に多くのdownvotesを得る理由を説明してもらえますか? – Curious

答えて

4

複数のスレッドがアップグレード可能なロック

TLを取得するとき、私は行方不明ですいくつかのデッドロックの可能性がある; DRはい、あります。 1つ(または複数の共有ロック)と一緒に

これは本当にデッドロックの可能性には影響を与えません。アップグレード可能なロックが存在するときに共有ロックを許可することは、排他ロックと比較してアップグレード可能なロックの機能に過ぎません。


最初に、アップグレード可能なロックを使用できるかどうかを考えてみましょう。私たちは、次のような状況を想像しなければならない。

  • いくつかのライター・スレッドが条件(読み出し動作)を確認する必要があり、その依存、
  • が条件をチェック状態を変更することは
  • 高価な条件はめったに満たされていません。
  • 他のスレッドも状態を読み取ります。今

、私たちは無アップグレードロックで、我々は唯一のリーダー(共有)/ライタ(排他)ロックを持っていることを考える:

  1. Writerが排他ロックを取得し、条件
  2. をチェックを開始
  3. 高価なチェック操作が実行されている間は、他のスレッドはブロックする必要があります。

チェック・ライト・サイクルの読取り部分が読取りスレッドをブロックしてしまうという欠点が考えられます。だから、私たちは代替手段を考えてみましょう:

  1. Writerは共有ロックがかかり、
  2. 他のスレッドもライターは、読み取りロックを条件をチェックし、リリースしている共有ロックに
  3. がかかる場合があり
  4. 状態をチェックを開始
  5. 条件が満たされていた、と筆者は今の状態のチェックが終了したことがあり

つ以上の作家3と4の間を続行するために排他ロックを取るしようとした - 彼らは共存を確認することができるためにncurrently - 排他的なロックを取るために今競争している。 1つだけ勝つことができ、他はブロックする必要があります。彼らがブロックしている間、勝者は状態を変更しています。

この状況では、排他ロックを取得するのを待機している作者は、チェックした条件が有効であると想定できません。もう1人の作家が前にロックを握っていて、状態が変更されている可能性があります。彼らはこれを無視することができます。これは、条件との関係と変更が何であるかによって、未定義の動作につながる可能性があります。あるいは、排他的ロックを取得したときに状態を再度確認することができます。これは、レースのために無駄だった重複チェックを除いて、最初のアプローチに戻します。いずれにせよ、このアプローチは最初のアプローチよりも悪いです。


上記の状況のた​​めのソリューションは、特権の読み取り(アップグレード)ロックです:

  1. ライターが特権ロックがかかり、
  2. 他のスレッドが共有ロック
  3. がかかる場合があります状態をチェックを開始
  4. Writerは満足していた条件をチェックし、排他ロックにアップグレードしました(他のロックが解放されるまでブロックする必要があります)。

複数のライターに特権ロックが与えられた状況を考えてみましょう。彼らは高価な状態を同時にチェックすることができますが、それは素晴らしいですが、彼らはまだロックをアップグレードするための競争があります。今回は、各ライターが読み取りロックを保持しており、すべての読み取りロックが解放されるまで待ってからアップグレードできるため、競合がデッドロックになります。

アップグレード可能なロックが他のアップグレード可能なロックに対して排他的である場合、このデッドロックは発生せず、高価なチェックと変更の間にレースは存在しませんが、ライターがチェック中。

+0

「アップグレード可能なロックが他のアップグレード可能なロックと排他的である」とはどういう意味ですか?他のリーダーロックと一緒にアップグレード可能なロックが1つしか存在しないとお考えですか? – Curious

+0

@Curiousはい。私は今、その文に「関係して」追加しました。 – user2079303

+0

解決策は非常に簡単であることが判明しました!なぜ私はそれがすぐに考えられないのか分からない。 – Curious

関連する問題