この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 18751|答える: 0

[ヒント] C# Read/write Lock ReaderWriterLockSlim の使用

[リンクをコピー]
掲載地 2017/03/09 16:59:19 | | | |
読み書きロックの概念はシンプルで、複数のスレッドが同時に読み取りロックを取得することができますが、同時に書き込みロックを取得できるスレッドは1つだけなので、共有排他的ロックとも呼ばれます。 C#では、読み書きロック関数を完了するためにReaderWriterLockSlimクラスを使用することが推奨されています。
場合によっては、オブジェクトへのリード数が修正数をはるかに上回ることがあり、単にロックでロックされている場合、読み取りの効率に影響が出ます。 読み書きロックを使用する場合、複数のスレッドが同時にオブジェクトを読み取ることができ、ライトロックがオブジェクトを占有している時のみブロックされます。
簡単に言えば、スレッドがリードモードに入ると、他のスレッドもリードモードに入ることができます。もしスレッドがこの時点で書き込みモードに入りたいと仮定すると、そのスレッドはブロックされなければなりません。 読み取りモードが終了するまで。
同様に、スレッドが書き込みモードに入ると、他のスレッドは書き込みや読み取りを望むかどうかにかかわらずブロックされます。
書き込み/読み取りモードに入る方法は2つあります:
EnterReadLockは書き込みモードのロック状態に入ろうとします。
TryEnterReadLock(Int32)は読み取りモードロックの状態に入力しようとし、整数タイムアウトを選択するオプションがあります。
EnterWriteLockはWrite Mode Lockの状態に入ろうとします。
TryEnterWriteLock(Int32)は書き込みモードロック状態の入力を試み、タイムアウト時間を選択できます。
書き込み/読み取りモードを終了する方法は2つあります:
ExitReadLockは読み取りモードの再帰カウントを減らし、結果としてカウントが0(ゼロ)になったときに読み取りモードを終了します。
ExitWriteLockは書き込みパターンの再帰カウントを減らし、結果のカウントが0(ゼロ)になったときに書き込みモードを終了します。
使い方は以下の通りです:



スレッド3とスレッド4は同時にリードモードに入ることができ、スレッド5は5秒後に書き込みモードに入ることができます(つまりスレッド3と4がリードロックを解除した後)。
上記のコードを修正し、まず書き込みモードで2スレッドを開き、次に読み取りモードでスレッドを開きます。コードは以下の通りです:
      


結果は以下の通りです。

ご覧の通り、スレッド3とスレッド4はどちらも書き込みモードに入りますが、スレッド3が最初に書き込みロックを占有するため、スレッド4は入力までに10秒待たなければなりません。 スレッド5と6は読み取りロックを占有する必要があるので、スレッド4が書き込みロックを終了するまで待ちましょう。
TryEnterReadLockとTryEnterWriteLockはタイムアウトを設定できます。この文に進むと、スレッドはここでブロックします。ロックがこの時点で占有されていればtrueを返します。タイムアウト時間がロックを占有していなければfalseを返し、ロックの占有を放棄し、次のコードを直接実行し続けます。
EnterUpgradeableReadLock
ReaderWriterLockSlimクラスは、EnterWriteLockやTryEnterWriteLockメソッドを呼び出すことで書き込みモードにアップグレードできる点で、読み取りモードと異なります。 なぜなら、一度にアップグレード可能なモードは一つだけだからです。 アップグレード可能モードに入ったスレッドは読み取りモードのスレッドに影響を与えません。つまり、アップグレード可能モードに入ると、任意の数のスレッドが同時に読み取りモードに入ることが妨げられません。 複数のスレッドがすでに書き込みロックの取得を待っている場合、EnterUpgradeableReadLockを実行すると、それらのスレッドがタイムアウトするか書き込みロックを終了するまでブロックされます。
以下のコードは、アップグレード可能な読み取りモードで書き込みロックにアップグレードする方法を示しています。



読み書きロックがパフォーマンスに与える影響は明白です。
以下のテストコード:


上記のコードは、500のタスクの動作をシミュレートしており、それぞれがスレッドプールスレッドを占め、そのうち20が書き込みスレッド、480のリードスレッドがシミュレートされています。 ロックメソッドとReaderWriterLockSlimメソッドのテストには、それぞれデータの読み取りに10ms、書き込みに100msかかります。 ReaderWriterLockSlimの場合、480スレッドが同時に読み取ると10ms、20回の書き込み操作が2000msを占めるため2010ms、通常のロック方式はすべて排他的であるため、480回の読み取り操作は4800ms+20の書き込み操作、2000ms=6800msと推定できます。 その結果、顕著な性能向上が見られました。






先の:Visual Studio 2017 オフラインインストールパッケージ 18GB Baiduクラウドダウンロード
次に:Struts2バージョン2.2および2.3における最新の脆弱性と攻撃手法
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com