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

dri*_*eed 5 c++ scheduled-tasks visual-c++ c++11 ppl

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

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

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

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

did*_*erc 1

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

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

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

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