我们使用PPL Concurrency :: TaskScheduler 将事件从我们的媒体管道发送到订阅客户端(通常是GUI应用程序)。
这些事件是传递给 Concurrency :: TaskScheduler :: ScheduleTask()的C ++ lambda。
但是,在负载下,管道可以以比客户端消耗它们更高的速率生成事件。
如果计划任务的“队列”大于N,我是否可以使用PPL策略使事件调度程序不对事件(实际上是计划任务)进行排队?如果没有,我将如何推出自己的?
答案 0 :(得分:1)
看看API,似乎没有办法知道调度程序是否负载过重,也没有办法告诉它在这种情况下如何表现。我的理解是,尽管可以使用策略对调度程序中可以运行的并发线程数量进行限制,但调度程序可以接受或拒绝新任务的协议对我来说并不清楚。
我敢打赌,您必须自己实现该机制,方法是计算调度程序中已有多少任务,并在调度程序之前设置一个大小有限的队列,以帮助您减轻传入任务的流量。
我想你可以为你的lambdas使用一个简单的std :: queue,每次你有一个新的事件,你检查正在运行的任务数,并从队列中添加尽可能多的任务以达到你的最大运行任务计数。 如果之后队列仍然满,则拒绝新任务。
要处理正在运行的任务记帐,您可以使用在完成时递减计数器的函数来包装任务(使用互斥锁以避免竞争),并在计划新任务时递增计数器。