1

これは、C# で提供されているサンプル プログラムの 1 つを少し変更したものです。

using System;
using System.Threading;

namespace SemaphorTest
{
    class Program
    {
        static Semaphore gate = new Semaphore(3, 3);
        static void Main(string[] args)
        {
            for (int i = 0; i < 5; i++)
            {
                Thread t = new Thread(Enter);
                t.Start(i);
            }
        }

        public static void Enter(Object id)
        {
            Console.WriteLine("Thread " + id + " wants to enter.");
            gate.WaitOne();
            Console.WriteLine("Thread " + id + " is in.");
            Thread.Sleep(500 * (Int32)id);
            Console.WriteLine("Thread " + id + " leaving.");
            gate.Release();
        }
    }
}

これにより、次の出力が出力されます(一見ランダムな順序で):

Thread 0 wants to enter.
Thread 1 wants to enter.
Thread 1 is in.
Thread 0 is in.
Thread 2 wants to enter.
Thread 3 wants to enter.
Thread 0 leaving.
Thread 3 is in.
Thread 4 wants to enter.
Thread 2 is in.
Thread 1 leaving.
Thread 4 is in.
Thread 2 leaving.
Thread 3 leaving.
Thread 4 leaving.

ただし、次のように Thread.Join() を追加すると、出力が大幅に変更されます。

for (int i = 0; i < 5; i++)
            {
                Thread t = new Thread(Enter);
                t.Start(i);
                t.Join();
            }

出力を次のように変更します。

Thread 0 wants to enter.
Thread 0 is in.
Thread 0 leaving.
Thread 1 wants to enter.
Thread 1 is in.
Thread 1 leaving.
Thread 2 wants to enter.
Thread 2 is in.
Thread 2 leaving.
Thread 3 wants to enter.
Thread 3 is in.
Thread 3 leaving.
Thread 4 wants to enter.
Thread 4 is in.
Thread 4 leaving.

なぜこれが起こるのですか?これらのスレッドはデフォルトでフォアグラウンド スレッドであり、メイン スレッドはそれらが完了するのを待つ必要がないことを知っています (メイン スレッドが完了した後でも実行されるため、ここでは thread.Join() は必要ありません)。しかし、変更後に作成された順序で実行される理由がわかりません。何か案は ?

Thanks
Dileep Balakrishnan 
4

3 に答える 3