Ожидание, пока все Потребители находятся в состоянии ожидания в реализации Продюсера и Многопользовательского режима. - PullRequest
2 голосов
/ 07 ноября 2019

Фон

Я реализовал фрагмент кода на C #, который является эквивалентом производителя со многими потребителями, использующими методы Monitor и PulseAll.

Я хотел бы предоставить опциючтобы производитель ждал перед производством, пока все потребители не будут ждать.

Это упрощенная реализация на стороне потребителя:

lock (_lock)
{
    while (! _condition)
    {
        Monitor.Wait(_lock);
    }
}

И это упрощенная реализация на стороне производителя:

lock (_lock)
{
    _condition = true;
    Monitor.PulseAll(_lock);
}

Это хорошо известный шаблон, который достаточно эффективен и хорошо работает в моем случае.

Проблема

В некоторых случаях я хотел бы иметь возможностьпроизводитель ждет, прежде чем вызвать код производителя, указанный выше, пока все потребители не окажутся внутри вызова Monitor.Wait().

Концепция решения для одного потребителя

Давайте упростим вопрос для случая одного потребителя. Решение требует, чтобы производитель подождал дополнительный объект синхронизации, который потребитель может сигнализировать атомно при его входе в Monitor.Wait().

Концепция решения для нескольких потребителей

Обобщая вышеупомянутое решение, все потребители должны получить доступ к многопоточному счетчику, который инициализируется с помощью числа потребителей.

Каждый потребитель будет атомарно вызывать Monitor.Wait() и уменьшать счетчик. Также в рамках атомарного вызова каждый потребитель будет проверять, равен ли счетчик нулю после уменьшения, и, если это так, повторно инициализировать счетчик и сигнализировать производителю.

Сводка

в реализации Producer и Multi-Consumer в C # Мне нужно разрешить производителю ждать, пока все Потребители будут в состоянии ожидания, прежде чем производить.

Iне нашли способ реализовать это на основе мониторов.

Я бы предпочел решение, основанное на мониторах, но если бы совсем другой подход сделал это проще, это также было бы здорово.

1 Ответ

1 голос
/ 07 ноября 2019

Вы можете использовать CountdownEvent , для этого потребители должны сообщить о событии, затем производитель может подождать, чтобы войти в замок, пока обратный отсчет не достигнет нуля.

...