【问题标题】:Multiple pre-emptive thread pools in TBBTBB 中的多个抢占式线程池
【发布时间】:2014-05-01 13:01:26
【问题描述】:

我们需要创建多个实时处理链,一​​个以 n Hz 运行,另一个以 x、y 和 z Hz 运行在单个进程中。其中 x、y 和 z 是 n 的某个倍数(不一定是简单倍数)。例如,一条链以 1Hz 运行,而另一条链以 3Hz 和 4Hz 运行。每个处理链都需要利用 TBB 来并行化它们的一些计算等,因此需要有一个与硬件处理器数量相匹配的 TBB 工作线程池,但较高频率的链需要抢占较低频率的链为了使系统正常工作。使用 TBB 如何实现这一点?

从文档看来,不可能创建相互抢占的 TBB 工作线程池,因为 TBB 任务组等似乎共享一个真实线程池,并且似乎没有无论如何设置 TBB 工作线程的实际系统优先级,还是我错过了什么?

【问题讨论】:

    标签: multithreading real-time scheduling tbb


    【解决方案1】:

    首先,TBB 不是为实时系统设计的。不过,几赫兹的要求看起来已经足够宽松了。

    其次,TBB 不是为用作线程池而设计的。它建议使用用户级别的非抢占式任务调度程序,而不是操作系统级别的抢占式线程调度。 TBB 假设任务是有限的并且足够小,以提供调度程序可以在它们之间切换的点,而不是操作系统可以切换线程的执行上下文。因此,除了一些特殊情况外,请求比硬件提供更多的工作线程没有意义(即超额订阅),因此线程级优先级对于 TBB 也没有意义。

    如果您不相信上述论点并想尝试您的设计,有一种方法可以使用两个社区预览功能:task_arena 用于工作隔离,task_scheduler_observer extensions 为进入一个工作线程的工作线程分配系统优先级竞技场。

    TBB task priority 功能看起来像是一种更原生的 TBB 方法来满足所描述的要求。虽然它仅限于 3 级优先级,但 task_group_context 的优先级可以动态更改,可用于动态重新排序任务。

    【讨论】:

    • 非常感谢您的及时和有益的回复,我们会跟进您的回答并在某个时候回复您,让您了解我们的进展情况。
    • @user3454602,你最终选择了什么方法?如果它适合你,请接受答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 2018-09-16
    • 1970-01-01
    • 2017-09-28
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多