134

ウィキペディアによると、

共有ロックは「読み取りロック」と呼ばれることもあり、排他ロックは「書き込みロック」と呼ばれることもあります。

「共有」と「排他的」という用語の背後にある理由を説明できますか?

4

4 に答える 4

496

これは楽しい(そして適切な)アナロジーだと思ったので、私はこの答えを書き留めました:

ロック可能なオブジェクトは、教師(ライター)と多くの生徒(リーダー)がいる教室の黒板(ロック可能)と考えてください。

教師がボードに何か(排他的ロック)を書いている間:

  1. まだ書き込まれているため、誰もそれを読み取ることができず、彼女はあなたのビューをブロックしています=>オブジェクトが排他的にロックされている場合、共有ロックを取得することはできません

  2. 他の教師が立ち上がって書き始めることも、ボードが読めなくなり、生徒を混乱させることもありません=>オブジェクトが排他的にロックされている場合、他の排他的なロックを取得することはできません

生徒がボードの内容を読んでいるとき(共有ロック):

  1. それらはすべて、その上にあるものを一緒に読み取ることができます=>複数の共有ロックが共存できます

  2. 教師は、ボードをクリアしてさらに書き込む前に、読み取りが完了するのを待ちます=> 1つ以上の共有ロックがすでに存在する場合、排他ロックを取得することはできません

于 2012-08-07T00:19:25.120 に答える
41

それはかなり簡単です。読み取りロックは、複数のプロセスが同時に読み取ることができるため、共有ロックとも呼ばれます。読み取りロックのポイントは、別のプロセスによる書き込みロックの取得を防ぐことです。対照的に、書き込みロックは、書き込み操作が完了している間は他のすべての操作を禁止するため、排他的として説明されます。

したがって、読み取りロックは「今すぐ読み取ることができますが、書き込みたい場合は待機する必要があります」と表示されますが、書き込みロックは「待機する必要があります」と表示されます。


あなたが研究を支援するために研究していることは承知していますが、講義をしたいという衝動に抵抗することはできません。

ロックの不適切な使用は、パフォーマンスの問題の主な原因です。読み取りロックと書き込みロックを区別するロックシステムを使用することは良いスタートですが、注意深い設計により、ロックの必要性の多くを排除できる場合があります。たとえば、セッション状態は、状態の要素ごとに1つのグローバルコレクションで保持されるべきではありません。

私は実際にこれが行われるのを見ました。これはひどい設計であり、セッション状態が最後に変更されるたびにボクシングとコレクションへの変更が発生し、書き込みロックが長引くことになります。オーバーヘッドが機能しなくなり、サーバーがシングルスレッドの動作に効果的に減少しました。

すべてのセッション状態を構造体に単純に集約することは、大きな改善でした。セッション状態の変更は、セッションの状態構造体のメンバーの値を変更しただけです。他のセッションにはセッションの状態を直接参照する機会や機会さえなかったため、更新されるコレクションはセッションのリストだけでした。その結果、セッション中は開始時と終了時のみロックが完全に不要なり、スループットが3000倍に向上しました。

他の一般的なロックシナリオは、ユーザーアプリケーションのスレッド間で共有されるリソースです。最新のフレームワークのほとんどは、ロックではなくメッセージを使用してこれに対処しています。「UIスレッドに移行」すると、実際には、関数ポインターといくつかのパラメーター(または実装によってはデリゲートとスタックフレーム)を含むメッセージをキューに入れることになります。

于 2012-08-06T23:59:44.770 に答える
9
  • 排他的または書き込みロックは、ファイルの指定された部分に書き込むためのプロセス排他的アクセスを提供します。書き込みロックが設定されている間、他のプロセスはファイルのその部分をロックできません。

  • 共有ロックまたは読み取りロックは、他のプロセスがファイルの指定された部分に対して書き込みロックを要求することを禁止します。ただし、他のプロセスは読み取りロックを要求できます。

詳細:http ://www.gnu.org/software/libc/manual/html_node/File-Locks.html

于 2012-08-07T00:00:30.230 に答える
2

データベース側でも同じ原理です。Oracleのドキュメントによる

排他的ロックモードは、関連するリソースが共有されるのを防ぎます。このロックモードは、データを変更するために取得されます。リソースを排他的にロックする最初のトランザクションは、排他的ロックが解放されるまでリソースを変更できる唯一のトランザクションです。

共有ロックモードでは、関連する操作に応じて、関連するリソースを共有できます。データを読み取る複数のユーザーがデータを共有し、共有ロックを保持して、ライター(排他ロックが必要)による同時アクセスを防ぐことができます。複数のトランザクションが
同じリソースの共有ロックを取得できます。

于 2013-08-22T04:05:53.117 に答える