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

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

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

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

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

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

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

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

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

转载注明原文:c – 如何使用Microsoft PPL轻量级任务调度程序实现回退? - 代码日志