如何使用Microsoft PPL轻量级任务调度程序实现回退?

时间:2012-10-18 15:30:14

标签: c++ visual-c++ c++11 scheduled-tasks ppl

我们使用PPL Concurrency :: TaskScheduler 将事件从我们的媒体管道发送到订阅客户端(通常是GUI应用程序)。

这些事件是传递给 Concurrency :: TaskScheduler :: ScheduleTask()的C ++ lambda。

但是,在负载下,管道可以以比客户端消耗它们更高的速率生成事件。

如果计划任务的“队列”大于N,我是否可以使用PPL策略使事件调度程序对事件(实际上是计划任务)进行排队?如果没有,我将如何推出自己的?

1 个答案:

答案 0 :(得分:1)

看看API,似乎没有办法知道调度程序是否负载过重,也没有办法告诉它在这种情况下如何表现。我的理解是,尽管可以使用策略对调度程序中可以运行的并发线程数量进行限制,但调度程序可以接受或拒绝新任务的协议对我来说并不清楚。

我敢打赌,您必须自己实现该机制,方法是计算调度程序中已有多少任务,并在调度程序之前设置一个大小有限的队列,以帮助您减轻传入任务的流量。

我想你可以为你的lambdas使用一个简单的std :: queue,每次你有一个新的事件,你检查正在运行的任务数,并从队列中添加尽可能多的任务以达到你的最大运行任务计数。 如果之后队列仍然满,则拒绝新任务。

要处理正在运行的任务记帐,您可以使用在完成时递减计数器的函数来包装任务(使用互斥锁以避免竞争),并在计划新任务时递增计数器。