任意の数のスレッドを起動し、それぞれが同じメソッドを実行しますが、パラメーターは異なります。各スレッドは特定のポイントでブロックし、すべてのスレッドが同じポイントに到達するまで待つ必要があります。(スターティングブロックに入るレーサーのように)
すべてのスレッドがそれぞれ準備ができていることをスターターに通知する方法に困惑しています。
任意の数のスレッドを起動し、それぞれが同じメソッドを実行しますが、パラメーターは異なります。各スレッドは特定のポイントでブロックし、すべてのスレッドが同じポイントに到達するまで待つ必要があります。(スターティングブロックに入るレーサーのように)
すべてのスレッドがそれぞれ準備ができていることをスターターに通知する方法に困惑しています。
解決策はBarrier Classを使用することです。
少し前まで、私もマルチスレッドに苦労していました。あなたが達成しようとしていることは、あなたが知っていることだけを使用して非常に簡単な方法で行うことができます. ここにアイデアがあります:
class MyThread
{
private Thread thread;
private bool isWaitingAtPointA = false;
private bool continueWorking = false;
public MyThread ()
{
thread = new Thread(DoMyStuff);
}
private void DoMyStuff()
{
//do stuff
//when at point A :
isWaitingAtPointA = true;
while (!continueWorking)
{
Thread.Sleep(10);
}
isWaitingAtPointA = false;
continueWorking = false;
//do more stuff
}
public bool isAtWaitingPointA()
{
return isWaitingAtPointA;
}
}
次に、すべての MyThread オブジェクトをインスタンス化し、それらのスレッドを開始し、メイン スレッドから continueWorking を true に設定してロックを解除する、メイン スレッドに MyThread のリストを作成します。もちろん、isAtWaitingPointA() を呼び出すことで、すべてのスレッドがポイント A にあるかどうかを確認できます。このアプローチは「制御変数」と呼ばれます (私が間違っている場合は誰かが私を修正してください)。それらすべてに使用してもらいたいメソッドは、ここでは DoMyStuff() で表されており、コードの冗長性を避けるために別の場所で定義できます。
これがあなたにインスピレーションを与えることを願っています=)
ロックを使用すると、スレッドのアクセスを同期できると思います。
これを試して:
lock (lockThis)
{
// Access thread-sensitive resources.
}