В ожидании полностью выпущенного семафора? - PullRequest
0 голосов
/ 28 февраля 2011

Возможно ли (в .net) заставить поток ждать, пока семафор будет "полностью сигнализирован"?В частности, вот что я ищу:

Создайте семафор в главном потоке.Поставьте в очередь ряд других потоков, используя .WaitOne ().Отпустите все ручки семафора.Подождите, пока все его ручки будут «пустыми».Возобновите операцию в главном потоке.

Для ясности, вот некоторый код:

using System;
using System.Threading;

namespace ConcurrencySample01
{
    class Program
    {
        private static Semaphore _MaitreD = new Semaphore(0, 4);
        private static Random _Rnd = new Random();

        static void Main(string[] args)
        {
            Console.WriteLine("The restaurant is closed. No one can eat.");
            Thread.Sleep(1000);

            for (int i = 1; i <= 6; i++)
            {
                Thread t = new Thread(Diner);
                t.Start(i);
            }
            Console.WriteLine("The restaurant is opening.");
            Console.WriteLine("Empty seat count: {0}", 4 - _MaitreD.Release(4));

            // HERE IS WHERE I WANT TO WAIT.

            Console.WriteLine("The table is empty.");
            Console.ReadLine();

        }


        private static void Diner(object num)
        {
            Console.WriteLine("Diner {0} enters the restaurant and requests a seat.", num);
            _MaitreD.WaitOne();
            Console.WriteLine("Diner {0} sits down and begins to eat.", num);
            Thread.Sleep(1000 + _Rnd.Next(1000));
            Console.WriteLine("Diner {0} finishes and gets up.", num);
            Console.WriteLine("Empty seat count: {0}", _MaitreD.Release() + 1);
        }



    }
}

1 Ответ

1 голос
/ 28 февраля 2011

Здесь требуется два объекта синхронизации.Тот, который вы уже получили, семафор моделирует таблицы.Вам нужен еще один, чтобы смоделировать дверь.Событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...