Semaphore

Обмежує кількість одночасно запущених потоків

        static Semaphore semaphore = new Semaphore(3, 3);   // 3 при старті і 3 потім

        static void Main(string[] args)

        {

            for (int i = 0; i < 6; i++)

            {

                new Thread(F1).Start();

            }

            Console.ReadKey();

        }

        static void F1()

        {

            Console.WriteLine("Wait... " + Thread.CurrentThread.ManagedThreadId);

            semaphore.WaitOne();

            Console.WriteLine("START> " + Thread.CurrentThread.ManagedThreadId);

            Thread.Sleep(3000);

            Console.WriteLine("END " + Thread.CurrentThread.ManagedThreadId);

            semaphore.Release();

        }

Wait... 3

Wait... 6

Wait... 4

Wait... 5

START> 3

Wait... 8

START> 6

Wait... 7

START> 4

END 3

END 6

START> 8

START> 5

END 4

END 8

START> 7

END 5

END 7