Мы используем PPL Параллелизм :: TaskScheduler отправлять события из нашего медиа-конвейера подписанным клиентам (обычно это приложение с графическим интерфейсом).
Эти события — C ++ лямбды, передаваемые Параллелизм :: TaskScheduler :: ScheduleTask ().
Но под нагрузкой конвейер может генерировать события с большей скоростью, чем клиент может их потреблять.
Есть ли стратегия PPL, которую я могу использовать, чтобы диспетчер событий не поставить в очередь событие (на самом деле, запланированное задание), если «очередь» запланированных заданий больше, чем N? А если нет, то как бы я покатился?
Глядя на API, кажется, что нет никакого способа узнать, идет ли планировщик под большой нагрузкой или нет, и нет способа рассказать ему, как вести себя в таких обстоятельствах. Насколько я понимаю, что хотя можно установить ограничения на количество одновременных потоков в планировщике, используя политики, протокол, по которому планировщик может принимать или отклонять новые задачи, мне неясен.
Я держу пари, что вам придется реализовать этот механизм самостоятельно, подсчитав, сколько задач уже есть в планировщике, и у вас есть очередь с ограниченным размером перед планировщиком, что поможет вам уменьшить поток входящих задач.
Я полагаю, что вы можете использовать простую очередь std :: queue для своих лямбд, и каждый раз, когда у вас появляется новое событие, вы проверяете, сколько задач выполняется, и добавляете как можно больше из очереди, чтобы достичь максимального количества выполняемых задач.
Если после этого очередь еще заполнена, вы отказываетесь от нового задания.
Для ведения учета запущенных задач вы могли бы обернуть свои задачи функцией, уменьшающей счетчик во время завершения (используйте мьютекс, чтобы избежать гонок), и увеличивать счетчик при планировании новой задачи.
Других решений пока нет …