5

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

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

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

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

4

1 回答 1

1

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

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

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

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

于 2012-11-06T18:16:16.493 回答