ホームページ  >  記事  >  バックエンド開発  >  C#のマルチスレッド機構に関する予備検討(3)

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

黄舟
黄舟オリジナル
2016-12-21 15:00:111008ブラウズ

ここで注意すべき点は、Main() 関数が配置されているスレッドに他のスレッドがアタッチされていることです。Main() 関数は、すべてがフォアグラウンドである場合、開始スレッドをメイン スレッドと呼ぶことができます。スレッドが停止されると、メインスレッドを終了でき、すべてのバックグラウンドスレッドが無条件に終了します。ミクロな観点からはすべてのスレッドが逐次実行されますが、マクロな観点からは並列実行していると考えることができます。

読者は Thread.ThreadState プロパティに気づいたはずです。このプロパティはスレッドの実行状態を表し、状況に応じて異なる値を持ちます。したがって、値を判断することでプログラム フローを設計できる場合があります。さまざまな状況での ThreadState の値は次のとおりです。

Aborted: スレッドが停止しました
AbortRequested: スレッドの Thread.Abort() メソッドが呼び出されましたが、スレッドはまだ停止していません
Background: スレッドはバックグラウンドで実行され、属性 Thread .IsBackground 関連
Running: スレッドは正常に実行されています
Stopped: スレッドが停止されました
StoPRequested: スレッドは停止を要求されています
Suspended: スレッドは一時停止されました (この状態では) 、Resume() メソッドを呼び出すことで再実行できます)
SuspendRequested : スレッドは一時停止を要求していますが、応答する時間がありません
Unstarted : の実行を開始するために Thread.Start() が呼び出されません。
WaitSleepJoin: スレッドは Wait()、Sleep()、Join() などのメソッドを呼び出すため、ブロックされた状態になります。バックグラウンドで実行されているスレッドには何が特別なのでしょうか?実際、バックグラウンド スレッドとフォアグラウンド スレッドの違いは 1 つだけです。それは、バックグラウンド スレッドはプログラムの終了を妨げないということです。プロセスのすべてのフォアグラウンド スレッドが終了すると、CLR (共通言語ランタイム環境) は、残っているバックグラウンド プロセスの Abort() メソッドを呼び出してプロセスを完全に終了します。

スレッドが CPU 時間を競合する場合、CPU はスレッドの優先順位に従ってサービスを提供します。 C# アプリケーションでは、ユーザーは、Highest、AboveNormal、Normal、BelowNormal、Lowest の 5 つの異なる優先順位を設定できます。スレッドの作成時に優先順位を指定しない場合、システムはデフォルトで ThreadPriority.Normal を設定します。スレッド

に優先度を割り当てるには、次のコードを使用できます:


//優先度を最低に設定します

myThread.Priority=ThreadPriority.Lowest;

スレッドの優先度を設定することによってユーザーへの応答など、比較的重要なスレッドを最初に実行するように手配できます。

スレッドの作成方法と制御方法について予備的な理解ができたので、スレッドの実装におけるより一般的な問題を掘り下げ、その解決策を検討します。

3. スレッドの同期と通信 - プロデューサーとコンシューマー

 1 つのスレッドがキューに要素を追加し、もう 1 つのスレッドがキューから要素を削除する状況を想定します。要素を追加するスレッドをプロデューサー、要素を取得するスレッドをコンシューマーと呼びます。プロデューサーとコンシューマーの問題は単純に見えますが、マルチスレッド アプリケーションでは解決する必要がある問題であり、スレッド間の同期と通信の問題が関係します。

前述したように、各スレッドは独自のリソースを持ちますが、コード領域は共有されます。つまり、各スレッドは同じ関数を実行できます。ただし、マルチスレッド環境では、複数のスレッドが同時に関数を実行し、データの混乱や予測不可能な結果が発生する可能性があるため、この状況を回避する必要があります。 C# は、コードのセクションを相互排他セクション (クリティカル セクション) として定義できるキーワード ロックを提供します。相互排他セクションでは、一度に 1 つのスレッドのみが実行を開始でき、他のスレッドは待機する必要があります。 C# では、キーワード lock は次のように定義されます:

lock(expression) statement_block

上記は、C# のマルチスレッド機構の予備調査 (3) の内容です。 PHP 中国語 Web サイト (www.php.cn)!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。