C#のマルチスレッド機構に関する予備検討(4)

黄舟
リリース: 2016-12-21 15:02:03
オリジナル
1143 人が閲覧しました

exPRession は追跡するオブジェクトを表し、通常はオブジェクト参照です。一般に、クラスのインスタンスを保護する場合はこれを使用でき、静的変数 (静的メソッド内の相互排他的なコード セグメントなど) を保護する場合は、通常、クラス名を使用します。 Statement_block は、相互に排他的なセクションのコードです。このコードは一度に 1 つのスレッドでのみ実行できます。

以下は、lock キーワードの使用方法と目的についてコメントで説明する例です:

//lock.cs
using System;スレッド化;

内部クラス アカウント

int 残高;
ランダム r = new Random();
内部アカウント (int 初期値)  {
残高 = 初期;
}

内部 int 引き出し(int 金額)
{

if (残高 & 0 )

{
//残高が 0 未満の場合、例外をスローします
throw new Exception("負の残高")
 }
//次のコードは、現在のスレッドがバランスの値の変更を完了する前に
//バランスを変更するために他のスレッドがこのコードを実行しないことを保証します値
//したがって、バランスの値は0
Lock(this)を超えることはできません。 .WriteLine("Current Thread:"+Thread.CurrentThread.Name);
//lockキーワードの保護がない場合はif条件判定実行後である可能性があります
  //別のスレッドが Balance=balance-amount を実行し、残高の値を変更しました
//この変更はこのスレッドには表示されないため、if が発生する可能性があります。条件は noより長い true
//ただし、このスレッドは、balance=balance-amount を実行し続けるため、残高は 0 未満になる可能性があります
if (balance >= Balance = 残高 - 金額;
戻り値 {
 0; i Withdraw(r.Next(-50, 100));

内部クラス テスト
 {
static 内部 Thread[] スレッド = 新しい Thread[10];
public static void Main()
{
 アカウント acc = 新しいアカウント ( 0);
for (int i = 0; i {
 スレッド t = 新しいスレッド (新しい ThreadStart( acc.DoTransactions));
threads[i] = t; int i = 0; i++)
threads[i] i.ToString();
for (int i = 0; i threads[i].Start(); Console.ReadLine(); スレッドがオブジェクトを共有する場合、一般的なコードと同様の問題が発生するため、System.Threading のクラス Monitor を使用する必要はありません。これはモニターと呼ぶことができます。モニターは、スレッドがリソースを共有するためのソリューションを提供します。

Monitor クラスはオブジェクトをロックでき、スレッドはロックを取得した場合にのみオブジェクトを操作できます。オブジェクト ロック メカニズムにより、混乱を引き起こす可能性がある状況では、一度に 1 つのスレッドのみがこのオブジェクトにアクセスできるようになります。 Monitor は特定のオブジェクトに関連付ける必要がありますが、静的クラスであるため、オブジェクトの定義に使用できません。また、そのメソッドはすべて静的であり、オブジェクトを使用して参照することはできません。次のコードは、Monitor を使用してオブジェクトをロックする状況を示しています。 ....//oQueue オブジェクトは現在のスレッドによってのみ操作できるようになります
Monitor.Exit(oQueue);// ロックを解放します

上に示したように、スレッドが Monitor.Enter() メソッドを呼び出してオブジェクトをロックすると、そのオブジェクトはそのオブジェクトによって所有されます。他のスレッドがこのオブジェクトにアクセスしたい場合、スレッドはそのオブジェクトが Monitor を使用するまで待つことしかできません。 Exit() メソッドを使用してロックを解放します。スレッドが最終的にロックを確実に解放するようにするには、try-catch-finally 構造体のfinally コード ブロックに Monitor.Exit() メソッドを記述します。モニターによってロックされたオブジェクトについては、そのオブジェクトに関連する一部の情報がメモリーに保管されます。1 つは現在ロックを保持しているスレッドの参照で、もう 1 つはロックを取得する準備ができているオブジェクトを保管する準備キューです。 3 番目のスレッドは待機キューで、オブジェクトの状態が変わるのを現在待機しているキューへの参照を保持します。オブジェクト ロックを所有するスレッドは、ロックを解放する準備ができると、Monitor.Pulse() メソッドを使用して待機キューの最初のスレッドに通知します。これにより、オブジェクト ロックが解放されると、スレッドは準備キューに転送されます。 、準備キュー内 スレッドはすぐにオブジェクト ロックを取得できます。

以下は、lock キーワードと Monitor クラスを使用してスレッドの同期と通信を実現する方法を示す例です。これは、典型的なプロデューサーとコンシューマーの問題でもあります。このルーチンでは、プロデューサ スレッドとコンシューマ スレッドが交互に数値を書き込み、コンシューマがそれを即座に読み取ってコメントで表示します。使用されるシステム名前空間は次のとおりです:

using System;
using System.Threading

上記は、C# のマルチスレッド機構の予備調査 (4) の内容です。 PHP 中国語 Web サイト (www.php.cn) に注意してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート