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

Posted

技术标签:

【中文标题】如何使用 Microsoft PPL 轻量级任务计划程序实现回退?【英文标题】:How to implement a back-off with Microsoft PPL lightweight task scheduler? 【发布时间】:2012-10-18 15:30:13 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于如何使用 Microsoft PPL 轻量级任务计划程序实现回退?的主要内容,如果未能解决你的问题,请参考以下文章

不止轻量,高性能图像处理库 ppl.cv 来袭

PPL攻击详解

如何在java中设计JPA多态关系?

您将如何在 Ruby 中设计这样的 DSL?

c ++ PPL并行工作-归约类“可组合”中的函数max()

PPL Combinable 的 SIMD 对齐问题