Я немного запутался в блокировке. В частности, этот код здесь из википедии о проблеме потребительского производителя.
http://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem#Example_in_C.2B.2B
Что произошло, если в очереди осталось более одного продюсера-продюсера? Если потребитель потребляет некоторую работу из очереди и выдает уведомление, чтобы указать, что очередь не заполнена, все они пытаются выполнить задание в очереди, что потребует, чтобы метод queue.push был потокобезопасным. Поскольку все они могут изменить очередь, этот код может сломаться. Я что-то упускаю?
Да, вам не хватает того факта, что xmutex
заблокирован, поэтому только один производитель может нажать что угодно за раз.
Когда вы ждете condition_variable
вы должны передать ему заблокированный мьютекс, который будет разблокирован во время ожидания. Когда вызов ожидания возвращает мьютекс, он будет заблокирован.
Хотя все производители получат уведомление is_not_full.notify_all();
события, и так все просыпаются, они смогут только повторно закрепить блокировку xmutex
одному за раз. Это весь смысл мьютекса.