Я создавал потребительские структуры производителей на C ++ только в операционной системе FreeRTOS, так что имейте это в виду. Это был мой единственный опыт с многозадачностью. Я бы сказал, что в этой программе я использовал только одного производителя и одного потребителя. И я сделал многозадачность в LabView, но это немного отличается от того, что вы могли бы иметь, я думаю.
Я думаю, что одним из вариантов может быть наличие структуры очереди, чтобы производитель помещал элементы в очередь, но если она полна данных, то можно надеяться, что вы сможете реализовать ее так, чтобы вы могли создать какую-то политику очереди следующим образом .
производитель может либо
- блокируется, пока в очереди не будет места для постановки в очередь,
- блокируется на определенный период времени и продолжается в другом месте, если время потрачено и не удалось поставить в очередь данные
- немедленно иди в другое место
Похоже, у вас есть порядок в очереди ...
Считыватели очереди могут иметь схожие три типа политик, по крайней мере, в FreeRTOS.
Как правило, если у вас есть двоичный семафор, он у вас есть, так что отправитель отправляет его, а получатель ожидает его. Используется для синхронизации или сигнализации.
По-моему, вы выбрали неправильный подход со "многими семафорами" (???)
То, что вам нужно, это структура очереди, в которую производитель вводит материал ...
Затем потребители читают из очереди все, что они должны делать ...
Если очередь пуста, вам нужна политика в отношении действий потоков чтения очереди.
Выбор политики необходим также тем читателям очереди и читателям семафоров, что им следует делать, когда очередь пуста или если они не получили полученный семафор. Я бы не использовал семафоры для такого рода проблем ...
Я думаю, что идея булевых переменных может сработать, потому что вы записываете только эту переменную в потоке производителя. Тогда другие потоки должны иметь возможность читать и опрашивать эту логическую переменную, если производитель активен ...
Но я думаю, что вы должны предоставить более подробную информацию о том, что вы пытаетесь сделать, особенно с потребительскими потоками, сколько потоков у вас есть, и на каком языке вы программируете и т.д. ...