3

スレッドを操作する基本的なスキルを習得するために、競馬をシミュレートする小さなアプリケーションを構築しています。

私のコードには次のループが含まれています:

        for (int i = 0; i < numberOfHorses; i++)
        {
            horsesThreads[i] = new Thread(horsesTypes[i].Race);
            horsesThreads[i].Start(100);
        }

競争を「公正」に保つために、新しく作成されたすべてのスレッドを、残りの新しいスレッドが設定されるまで待機させ、その後ですべてのスレッドを起動してメソッドの実行を開始する方法を探していました (注意してください)。技術的にスレッドを「同時に」起動できないことを理解しています)

基本的に、私はこのようなものを探しています:

        for (int i = 0; i < numberOfHorses; i++)
        {
            horsesThreads[i] = new Thread(horsesTypes[i].Race);
        }
        Monitor.LaunchThreads(horsesThreads);
4

3 に答える 3

1

私はManualResetEventゲートとして見ています。の中Thread、カウンターをデクリメントします。それでもゼロでない場合は、ゲートを待ちます。それ以外の場合は、ゲートを開きます。基本的:

using System;    
using System.Threading;
class Program
{
    static void Main()
    {
        ManualResetEvent gate = new ManualResetEvent(false);
        int numberOfThreads = 10, pending = numberOfThreads;
        Thread[] threads = new Thread[numberOfThreads];
        ParameterizedThreadStart work = name =>
        {
            Console.WriteLine("{0} approaches the tape", name);
            if (Interlocked.Decrement(ref pending) == 0)
            {
                Console.WriteLine("And they're off!");
                gate.Set();
            }
            else gate.WaitOne();
            Race();
            Console.WriteLine("{0} crosses the line", name);
        };
        for (int i = 0; i < numberOfThreads; i++)
        {
            threads[i] = new Thread(work);
            threads[i].Start(i);
        }
        for (int i = 0; i < numberOfThreads; i++)
        {
            threads[i].Join();
        }
        Console.WriteLine("all done");

    }
    static readonly Random rand = new Random();
    static void Race()
    {
        int time;
        lock (rand)
        {
            time = rand.Next(500,1000);
        }
        Thread.Sleep(time);
    }

}
于 2013-08-08T08:05:37.803 に答える