Многократное ожидание на одном замке

0

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

http://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem#Example_in_C.2B.2B

Что произошло, если в очереди осталось более одного продюсера-продюсера? Если потребитель потребляет некоторую работу из очереди и выдает уведомление, чтобы указать, что очередь не заполнена, все они пытаются выполнить задание в очереди, что потребует, чтобы метод queue.push был потокобезопасным. Поскольку все они могут изменить очередь, этот код может сломаться. Я что-то упускаю?

Теги:
multithreading
c++11

1 ответ

4
Лучший ответ

Да, вам не хватает того факта, что xmutex заблокирован, поэтому только один производитель может нажать что угодно за раз.

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

Хотя все производители получат уведомление is_not_full.notify_all(); события, и так все просыпаются, они смогут только повторно закрепить блокировку xmutex одному за раз. Это весь смысл мьютекса.

  • 0
    Кроме того, у вас все равно обычно есть только один продюсер. Если у одного уже есть много производителей, работающих параллельно, они также могут взять на себя работу потребителей. Основная задача производителя / потребителя (за очень, очень немногими исключениями) состоит в том, чтобы равномерно распределить n распараллеливаемых задач на m рабочих потоков или ядер выполнения. Если ожидать нескольких производителей, семафор был бы намного более разумной реализацией (избегая упомянутой вами проблемы с громовым стадом).
  • 0
    У этой реализации все еще есть другая проблема. Если имеется больше производителей, чем max_products, что в данном примере равно 10, есть вероятность, что 10 производителей ожидают, и когда они все проснутся, они все добавят в очередь, хотя это потокобезопасно, Количество товара в очереди может быть больше 10, что максимально допустимо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню