私は次のコードを持っています:
var x = new Thread(new ThreadStart(Delegate));
x.Start();
これにより、新しいスレッドが作成され、開始されます。
スレッドXがdowhileループなしで実行を開始したことをどのように検出できますか?
私は次のコードを持っています:
var x = new Thread(new ThreadStart(Delegate));
x.Start();
これにより、新しいスレッドが作成され、開始されます。
スレッドXがdowhileループなしで実行を開始したことをどのように検出できますか?
セマフォミューテックス、またはAuto/ManualResetEventを使用します。
//Initialize semaphore, set it to BLOCK
ManualResetEvent sema = new ManualResetEvent(false);
void Main()
{
var x = new Thread(Delegate);
//Request the system to start the thread.
//This doesn't mean the CPU will immediately run Delegate method
//but eventually it will do
x.Start(sema);
//Stop here and don't do anything on this thread until the semaphore is FREE
sema.WaitOne();
[continued main thread]
}
void Delegate(Semaphore sema){
//Unblock the semaphore
sema.Set(1);
[your code here]
}
マルチスレッドの背後にある原則の1つは、非決定論です。上記のように適切な手法を使用しないと、複数のスレッドで実行される操作の動作を予測できません。このような方法がある場合
void Main()
{
A();
B();
C();
}
次に、BがAの前またはCの後に実行されることはないことを確認します。同じことはマルチスレッドには当てはまりません。
void Main()
{
new Thread(A).Start();
new Thread(B).Start();
new Thread(C).Start();
D();
}
Bを実行しているstarted
スレッドがAを実行しているスレッドの後にあることは確かですが、マルチスレッドでは、これは別のことを意味します。MSDNおよびすべてのプログラミングブックの時点で、スレッドを開始するということは、マルチスレッドをサポートするためにカーネルに適切な機能を割り当てるようにOSに要求することを意味します。これが行われると(スレッドが正しく作成され、実行がスケジュールされる)、メソッドはエラーなしで戻ります。いくつかの要因に応じて、OSが3つのスレッドを任意の順序で実行する場合があります。
したがって、それらをコンソールにデバッグする場合(それぞれがを実行すると考えてください。Console.WriteLine("Hello, I'm thread A/B/C")
さまざまな実行で任意の順序を取得できます:A,B,C
;;など。A,C,B
B,C,A
したがって、Dを実行する前に、特定のスレッドまたはすべてのスレッドが実際に開始されていることを確認する必要があります。実際、シングルコアCPUの多くの場合、OSはD
すべてのスレッドの前にメソッドを実行することになっています。 。それも予測不可能です!したがって、A、B、Cがいつ実行されるかを予測できなかった後、Dがいつ実行されるかを予測することはできません!!
明示的な同期は、コードの実行を強制的に一時停止し、イベントが発生するのを待つ手法です。セマフォのリリースによって示されるイベントはコンテキストによって異なるため、あなたの場合は、メインスレッドに「デリゲートが開始するのを待ってから、好きなことをしてください」と言っているだけです:)
セマフォの使用は、無限ループで次のことを行うための効率的な方法です。
volatile bool threadStarted = false;
void Main()
{
var x = new Thread(Delegate);
x.Start();
while (!threadStarted);
[continued main thread]
}
void Delegate(Semaphore sema){
threadStarted = true;
[your code here]
}
セマフォを使用しても、特定のフラグが低いか高いかを継続的にチェックするためにCPUを浪費するだけではありません。
最も基本的なレベルでは、次のことを試すことができます。
if (((Thread)x).ThreadState==ThreadState.Running){
// do something interesting
}
x.ThreadState == System.Threading.ThreadState.Running
Thread.ThreadStateプロパティを使用して、その状態を見つけることができます。
スレッドが長寿命であると仮定した場合の最も簡単な方法は、Thread.IsAliveをチェックすることです。