我们需要创建一些以n Hz运行的实时处理链,以及在单个进程中以x,y和z Hz运行的其他处理链。其中x,y和z是n的一些倍数(不一定是简单的倍数)。例如,一条链以1Hz运行,另一条链以3Hz和4Hz运行。每个处理链都需要利用TBB来并行化他们的一些计算等,因此需要有一个与硬件处理器数量相匹配的TBB工作线程池,但是更高频率的链需要抢占更低频率链为了使系统工作。如何使用TBB实现这一目标?
从文档中可以看出,由于TBB任务组等似乎共享一个真正的线程池并且似乎没有,所以不可能创建相互抢占的TBB工作者竞争池。无论如何设置TBB工作线程的实际系统优先级,还是我错过了什么?
答案 0 :(得分:2)
首先,TBB不适用于实时系统。虽然,几Hz的要求看起来很放松。
其次,TBB不是用作线程池的。它建议用户级非抢占式任务调度程序,而不是OS级别的抢占式线程调度。 TBB假设任务是有限的并且足够小以提供调度程序可以比OS可以切换线程的执行上下文更有效地在它们之间切换的点。因此,除了一些特殊情况之外,请求更多的工作线程然后HW提供(即超额订阅)是没有意义的,因此线程级优先级对TBB没有意义。
虽然如果你不相信上述论点并且想尝试你的设计,有一种方法可以使用两个社区预览功能:task_arena用于工作隔离,task_scheduler_observer extensions用于分配系统优先级工人线进入竞技场。
TBB task priority功能看起来像TBB更原生的方法来满足所描述的要求。虽然,它仅限于3个级别的优先级,但task_group_context的优先级可以动态更改,可用于动态重新排序任务。