競合状態とデッドロックの説明

文書翻訳 文書翻訳
文書番号: 317723 - 対象製品
すべて展開する | すべて折りたたむ

目次

概要

Visual Basic .NET または Visual Basic 2005年は、最初に Visual Basic アプリケーションでのスレッドを使用する機能を提供します。スレッドは、競合状態やデッドロックなどの問題のデバッグについて説明します。この資料ではこれら 2 つの問題について説明します。

詳細

競合状態

競合状態は、2 つのスレッドで同時に共有変数にアクセスするときに発生します。最初のスレッドは、変数を読み取りし、2 番目のスレッドが変数から同じ値を読み取ります。最初のスレッドと 2 番目のスレッド値、業務を実行し、どのスレッドが値を書き込みます最後共有変数への参照を競合します。その値を書き込むスレッドの値は、最後は保持されます、スレッドは元のスレッドを書いたこと値を記述するため。

詳細と使用例

プロセッサで実行する定義済みの期間は、各スレッドが割り当てられます。スレッドに割り当てられている時間が経過するとプロセッサ、その次のターンまでに、スレッドのコンテキストを保存し、プロセッサが次のスレッドの実行を開始します。

1 行のコマンドは、競合状態が発生する方法競合状態が発生する方法を次の例を確認します。2 つのスレッドがあるし、合計と呼ばれる共有変数を更新している両方 (として表されるがdword ptr ds: [031B49DCh]のアセンブリ コードで)。

Visual Basic のコード:
   'Thread 1
   Total = Total + val1
				
   'Thread 2
   Total = Total - val2
				
上記の Visual Basic のコードのコンパイル (行番号) を持つアセンブリ コード:
 'Thread 1
 1.   mov         eax,dword ptr ds:[031B49DCh] 
 2.   add         eax,edi 
 3.   jno         00000033 
 4.   xor         ecx,ecx 
 5.   call        7611097F 
 6.   mov         dword ptr ds:[031B49DCh],eax 
				
 'Thread 2
 1.   mov         eax,dword ptr ds:[031B49DCh] 
 2.   sub         eax,edi 
 3.   jno         00000033 
 4.   xor         ecx,ecx 
 5.   call        76110BE7 
 6.   mov         dword ptr ds:[031B49DCh],eax 
				
アセンブリ コードを見ることができます操作の回数を参照して、簡単な加算を実行するには、下位レベルで、プロセッサを実行しています。スレッドは、プロセッサはその時に、アセンブリのコードの一部またはすべてを実行することがあります。このコードの競合条件の発生時になります。

合計が 100、val1 は 50 と val2 は 15 です。スレッド 1 を実行する機会を取得は、だけ手順 1 〜 3 を完了します。これは、スレッド 1、変数の読み取りし、追加を完了することを意味します。スレッドの 1 だけ待っている 150 の新しい値を記述します。1 のスレッドが停止した後、スレッド 2 は完全に実行するを取得します。これは、ことが書き込まれて値 (85) 変数の合計を計算、ことを意味します。最後に、スレッド 1 コントロールが回復し、実行が終了します。それは、その値 (150) を書き込みます。したがって、スレッド 1 が完了したら、合計の値は現在 85 の代わりに 150 です。

この可能性がありますを参照してくださいすることができます大きな問題です。バンキング プログラムは、この場合は、お客様があっている自分のアカウントにお金があります。

このエラーは、ランダムなスレッドの 1 の時間の前に実行を完了することが可能になっているため、プロセッサの有効期限が切れるし、スレッド 2 は、実行を開始できます。これらのイベントが発生した場合、問題は発生しません。スレッドの実行が非決定的で、したがって、時間、または実行の順序は制御できません。また、スレッドがデバッグ モードと実行時に異なる方法で実行可能性がありますに注意してください。また、系列内の各スレッドを実行する場合、エラーは発生しませんを確認できます。この乱数はこれらのエラーを追跡し、デバッグを困難にします。

発生、競合が発生しないように、共有変数は、一度に 1 つだけのスレッドがある共有変数にアクセスできるようにロックできます。これは控えめ、スレッド 2 は変数を解放する 1 のスレッドが待っている間、スレッド 2 の実行が停止、変数が 1 のスレッドにロックされている場合、スレッド 2 は変数も必要があります。(詳細については、「SyncLock」でこの資料の「関連情報」セクションを参照してください)。

現象

競合の最も一般的な症状は、複数のスレッド間で共有される変数の値を予測できません。これは、スレッドの実行順序のために発生します。いずれかの時点のスレッドの 1 つの wins といつか、他のスレッドの優先します。他の時間帯に実行が正常に動作します。また、各スレッドが別々 に実行される場合、変数の値は正しく動作します。

デッドロック

デッドロックは、2 つのスレッドそれぞれ、同時に、別の変数をロックしようとして、他のスレッドが既にロックされている変数をロックするときに発生します。その結果、各スレッドで実行が停止され、他のスレッドは、変数を解放するまで待機します。各スレッドが、他のスレッドが、何もが発生すると、変数が保持しているため、スレッドはデッドロック状態。

詳細と使用例

次のコードは、LeftVal と RightVal の 2 つのオブジェクト。
'Thread 1
SyncLock LeftVal
 SyncLock RightVal
  'Perform operations on LeftVal and RightVal that require read and write.
 End SyncLock
End SyncLock
				
'Thread 2
SyncLock RightVal
 SyncLock LeftVal
  'Perform operations on RightVal and LeftVal that require read and write.
 End SyncLock
End SyncLock
				
スレッド 1 は LeftVal のロックを許可するときに、デッドロックが発生します。プロセッサ スレッド 1 の実行を停止し、2 のスレッドの実行を開始します。2 ロック RightVal し LeftVal をロックしようとするスレッドします。LeftVal がロックされているため、スレッド 2 は停止し、LeftVal を解放するまで待機します。スレッド 2 が停止している場合、1 のスレッドは実行を継続する許可されます。スレッド 1 は RightVal をロックしようとしましたができません、スレッド 2 がロックされているため。その結果、スレッド 1 は RightVal が使用可能になるまで待機する起動します。各スレッドは、他のスレッドが待機している変数がロックされているため、他のスレッドの各スレッドが待機し、どちらのスレッドがそれを保持する変数のロックを解除します。

デッドロックは、常には発生しません。スレッド 1 のロックの両方を実行しているプロセッサがそれを停止する場合は、スレッド 1 はその操作を実行し、共有変数のロックを解除できます。スレッド 1、変数のロックを解除、スレッド 2 は期待どおり実行に進みます。

これらのコードのスニペットを並べて配置されますが、実習では、コードが別のモジュールまたはコードの領域で表示されるときに、このエラーは明らかです。このこの同じコードを正しく実行して、不正な実行が発生するため、追跡する非常に困難なエラーです。

現象

デッドロックの一般的な症状では、1 つまたは複数のスレッドが応答を停止します。これは、ハングとも呼ばれます。2 つ以上のスレッドは、変数、他のスレッドはロックを待つです。どちらのスレッドは、他の変数を取得するまでその変数を解放するため、スレッドは続行できません。プログラムは 1 つまたは両方のそれらのスレッドの実行の完了を待機している場合、プログラム全体がハングします。

スレッドとは何ですか。

プロセスは、単一のコンピューター上の指定した時刻に実行している別のアプリケーションを分離する使用されます。スレッドが行うことは、オペレーティング システムは、プロセスが実行されません。スレッドは、実行の単位です。オペレーティング システムはスレッドのタスクの実行のスレッドにプロセッサ時間を割り当てます。1 つのプロセスは、複数の実行スレッドを含めることができます。各スレッドは独自の例外ハンドラー、スケジューリングの優先順位、およびスレッドは、プロセッサに割り当てられていた時間内に実行を完了できない場合は、スレッドのコンテキストを保存するには、オペレーティング システムを使用する構造体のセットを保持します。コンテキストは、次のスレッドがプロセッサ時間を受信するまで保持されます。コンテキストには、スレッドがシームレスに実行を継続するのに必要であるすべての情報が含まれます。この情報には、スレッドのプロセッサのレジスタおよびホスト プロセスのアドレス空間内のコール スタックのセットが含まれます。

関連情報

詳細については、Visual Studio ヘルプを検索、次のキーワードを。
  • SyncLock.オブジェクトをロックすることができます。別のスレッドが同じオブジェクトをロックしようとすると、最初のスレッドを解放するまでブロックされます。SyncLock の誤用に起因する問題のため、慎重には、SyncLock を使用します。たとえば、このコマンドできます競合状態を防ぐがデッドロックが発生します。
  • インター ロック.選択された一連の基本の数値変数をスレッド セーフな操作を使用できます。
詳細については、マイクロソフト サポート技術資料を参照する下記事番号をクリックします。
316422 Visual Basic .NET におけるスレッド処理についての情報: ロードマップ
詳細については、次の MSDN Web サイトを参照してください。
スレッドおよびスレッド処理

プロパティ

文書番号: 317723 - 最終更新日: 2013年10月29日 - リビジョン: 3.0
この資料は以下の製品について記述したものです。
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
キーワード:?
kbvs2005swept kbvs2005applies kbinfo kbmt KB317723 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:317723
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com