Почему семафор зависает, если начальный счетчик равен нулю? - PullRequest
0 голосов
/ 10 ноября 2018

Этот код работает нормально, он получает одну запись семафора

static void Main(string[] args)
{
    Semaphore semaphore = new Semaphore(1, 1, "sem1");

    semaphore.WaitOne();

    Console.WriteLine("Press any Key to release semaphore");
    Console.ReadKey();

    semaphore.Release();
}

но этот метод ожидает метод WaitOne ().

static void Main(string[] args)
{
    Semaphore semaphore = new Semaphore(0, 1, "sem1");

    semaphore.WaitOne();

    Console.WriteLine("Press any Key to release semaphore");
    Console.ReadKey();

    semaphore.Release();
}

Я что-то упустил здесь? Спасибо

1 Ответ

0 голосов
/ 10 ноября 2018

Вы устанавливаете количество доступных запросов на ноль, а затем пытаетесь получить семафор. Поскольку доступных запросов нет, поток будет висеть на семафоре и будет ждать, пока какой-то другой поток освободит его.

Думайте о семафоре как о целом числе S. Когда вы WaitOne, две вещи могут произойти

  • Если S больше нуля, уменьшите его на единицу.
  • Если S равно нулю, приостановить поток, пока он не станет нулевым.

В первом примере вы инициализируете его одним, а затем получаете. Во втором случае вы инициализируете его нулем, поэтому поток ожидает. И он ждет бесконечно, так как нет других потоков для освобождения семафора.

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