Фон
Я реализовал фрагмент кода на 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не нашли способ реализовать это на основе мониторов.
Я бы предпочел решение, основанное на мониторах, но если бы совсем другой подход сделал это проще, это также было бы здорово.