マルチスレッドのC#の下でどのようにスレッドの安全性を確保するには?

シングルスレッドに関して、マルチスレッドプログラミングは独特の問題、スレッド安全性の問題になります。いわゆるセキュリティスレッドがあればそこに、実行時にコードを同時にプロセスで複数のスレッドがあり、これらのスレッドが同時にこのコードを実行することです。それぞれの結果は、シングルスレッドの業績と同じ、また、他の変数の値を実行し、それを期待した場合。スレッドの安全性の問題は、グローバル変数と静的変数によって引き起こされます。

次のように複数のスレッド、セキュアなアクセス静的変数を確保するためには、あなたは、確実にするためにロック機構を使用することができます。

1          // 静的グローバル変数をロックする必要が
 2          プライベート 静的 BOOL _isOK = falseに3          // ロックは、参照型の変数をロックすることができる
 4。         プライベート 静的 オブジェクト _lock = 新しい新しい オブジェクト();
  5          静的 ボイドMLOCK()
  。6          {
  7              / / マルチスレッディング
 。8              新しい新しいSystem.Threading.Thread(完了).Start();
  9              新たな新しいSystem.Threading.Thread(完了).Start();
 10              Console.ReadLine();
 11          }
 12は、 
13であり、         静的 無効完了()
 14          {
 15              // ロックが参照型変数ロックすることができる
16              のロック(_lock)を
 17。             {
 18は                 IF(!_isOK)は
 19。                 {
 20                      Console.WriteLineを(" OK " );
 21である                      _isOK = 真に22である                 }
 23れます             }
 24          }

これだけでは、次のためにロックアウト

プライベート静的オブジェクト_lock =新しいオブジェクト();

最初は私はちょうどオブジェクトロッカー=新しいオブジェクトを()書きます。

オンラインのコードを読んだ後、私はBaiduのでは、基本的にはプライベート静的読み取り専用ので、私のゲストを見下ろし

プライベート:インスタンスが公開されている場合は、その独立したコードは、オブジェクトをロックすることがあり、それはデッドロックが生じ、複数のスレッドがリリースを待つ同じオブジェクトを、表示されます。

上記のように、データ・タイプが共通の問題はまた、上記発生している場合:静的

読み取り専用:他のスレッドを実行するために来ることができるようにミューテックスオブジェクトが変更されたため、オブジェクトの値でロックが、変更されていたら、

なお、ロックは、オブジェクト型の参照をロックすることができます。次のようにさらに、非同期に加えロック機構、C位の高いバージョンに加えと、スレッドの安全性を確保するための方法を待ちます。

パブリック 静的 クラスAsynAndAwait 
 { 
        // 。STEP 1つの
        プライベート 静的 int型のカウント= 0 ;
         // 非同期とし、セキュリティを確保するため、マルチスレッド静的変数をカウント待つ
        パブリック 非同期 静的 ボイドML()
        { 
            // 連続スレッドの非同期と待つ複数処理
             // 文が実行完了を待つ後まで待つ
             // このスレッドの他の文を実行する前に、
             // STEP 2は
            待つ Task.Run(新しい新しいアクション(M2)を); 
            Console.WriteLineをは(現在は、スレッドID {0}です、System.Threading.Thread.CurrentThread.ManagedThreadId)。
            // 6ステップ 
            数++ ;
            // ステップ7 
            Console.WriteLineを(" M1ステップは{0}である" 、カウント)。
        } 

        パブリック 静的 ボイドM2()
        { 
            Console.WriteLineを(" 現在のスレッドIDが{0} " 、System.Threading.Thread.CurrentThread.ManagedThreadId)。
            // ステップ3 
            System.Threading.Thread.Sleep(3000 )。
            // ステップ4 
            数++;
            // ステップ5 
            Console.WriteLineを(" M2ステップは{0}である" 、カウント)。
        } 
}

タイミングチャートでは、我々はそこに2つのスレッドがある以下に示すように、対話、見ることができます。

  非同期と待機後、上記のコードの実行順序を以下に示します。

 

グローバル変数、静的変数への各スレッドは、読み取り専用の場合、書き込み動作は、一般的には、グローバル変数はスレッドセーフではありません。読み取りまたは変数に書き込みを複数のスレッドが同時に、一般的に検討する必要がある場合スレッドの同期、それ以外の場合は、スレッドの安全性に影響を与える可能性があります。

 

おすすめ

転載: www.cnblogs.com/qinyi173/p/11421834.html