дизайн ПрименениеSignaling между нитями
У меня есть C++ приложение, которое имеет производитель нить, несколько очередей (созданные во время выполнения) и потребительского потока.
Проводник получает данные через Tcp/Ip и помещается в соответствующую очередь (например, если данные являются типом A и помещены в очередь A).
Потребительский поток в настоящее время перемещает очереди от 1 до n для обработки данных из каждой очереди.
В соответствии с требованием нет необходимости отслеживать последнюю обновленную или последнюю очередь. До тех пор, пока какая-либо очередь обновляется, потребитель должен обработать из 1 - n очередей.
Если какой-либо размер очередей превышает установленный предел, поток производителя будет выталкивать первый элемент, прежде чем он вставляет новый элемент (для управления размером очереди).
синхронизация ресурсов и сигнализация между потоками:
В этом варианте осуществления, потребитель поток должен спать, пока не будет никакой очереди имеет данные от слушателя. потребительский поток должен просыпаться, только если производитель помещает данные в одну из очередей.
Несколько очередей синхронизированы между двумя потоками с использованием мьютекса. Сигнальная сигнализация реализуется между потоками, чтобы пробудить потребительский поток всякий раз, когда производитель помещает данные в любую из очередей.
Однако этот способ сигнализации для пробуждения потребительского потока позволяет потребителю спать, хотя есть данные в любой из очередей.
Издание:
Давайте этот сценарий, рассмотрим потребитель обрабатывает данные N-й очереди в; в то же время производитель может помещать данные в очередь n-1, n-2, а сигнализация не эффективна, так как потребитель бодрствует и обрабатывает n-ые данные. Как только потребитель завершит обработку n-й очереди данных, он будет спать, а данные в n-1, n-2 не будут обрабатываться до тех пор, пока слушатель не получит какой-либо дополнительный сигнал.
Как мы можем решить этот сценарий? Люди также советуют использовать semophore. Семафор относится к этому сценарию?
Заранее спасибо.
Как вы думаете? Какое ваше решение? – HAL
Возможно, семафора будет недостаточно, поскольку comsumer по-прежнему не получает информацию для повторного сканирования на измененных/вставленных элементах. Он просто получает знак hios: его твой ход. Вы можете играть с общей переменной, которая читается каждым пользователем каждый раз, она заканчивает элемент очереди (пусть говорят последним), а затем проверяет переменную, которая была установлена производителем, чтобы она должна была СТАВКА проверить очередь из начало. Если это так, то, что вам может понадобиться, – icbytes