C++ 国产工作队列与英特尔TBB

C++ 国产工作队列与英特尔TBB,c++,c,multithreading,gcc,tbb,C++,C,Multithreading,Gcc,Tbb,我们正在考虑使用C/C++的并行框架。我们有一些非常特殊的条件,但不能100%确定,例如,TBB可以添加一些“更多” 有N个正在运行的线程和一个同步的工作队列(使用pthreadmutex) 我们的工作是有优先级的(int) 作业被放入队列,空闲线程接受具有最高优先级的作业 这将重复,直到队列为空 好的,现在,我想知道像TBB(线程构建块)这样的框架是否可以从算法的角度为这个特殊场景提供更多功能??(因此,内部…我建议查看一下,看看是否有对您有用的内容 例如,在该部分下,没有一个并发队列,“

我们正在考虑使用
C/C++
的并行框架。我们有一些非常特殊的条件,但不能100%确定,例如,
TBB
可以添加一些“更多”

  • N
    个正在运行的线程和一个同步的工作队列(使用
    pthread
    mutex)
  • 我们的工作是有优先级的(
    int
  • 作业被放入队列,空闲线程接受具有最高优先级的作业
这将重复,直到队列为空


好的,现在,我想知道像
TBB
(线程构建块)这样的框架是否可以从算法的角度为这个特殊场景提供更多功能??(因此,内部…

我建议查看一下,看看是否有对您有用的内容

例如,在该部分下,没有一个
并发队列
,“一个高性能线程安全的非阻塞并发队列”。它不是优先级队列,因此您必须自己构建它

另一方面,在下面,有一些互斥变体可能会使您的生活更轻松

一句话:TBB并不是那么神奇,但它可能会有所帮助。

TBB可以为您提供:

  • 无锁并发队列。我不记得关于优先级队列的任何内容,但正如James在评论中所建议的,您可以自己在并发_队列上构建它
  • 针对多线程环境中的性能进行了优化的内存分配器
  • 原子变量之类的同步原语
  • 这是如何有效实现多线程的好主意

请注意,即使做每件事都是正确的,并且密集地使用TBB,与您自己的推动相比,您也可能不会注意到任何性能提升。这在很大程度上取决于您的系统,特别是当线程间通信,尤其是同步是一个瓶颈时。通常情况下,您的任务很小,而且任务很多。

TBB 4提供了一个并发的优先级队列(在中搜索“优先级”)。此外,如果您可以在设计程序时考虑任务而不是线程,那么使用TBB是很好的。事实上,它提供了很多东西来描述任务之间的依赖关系。此外,如果TBB对您很重要,它似乎是相当便携的

在我看来,用更健壮的东西来替换重互斥可以获得好处,比如spin\u rw\u互斥:。由于最有可能的插入/删除操作是快速的,所以您可以从非阻塞锁中获得更多好处。

我使用过包括OpenMP、Cilk在内的并行化框架。这提供了一个很好的抽象,使并行化相对容易。但是,我怀疑这些是否直接支持优先级队列,或者您是否可以修改它们的任务队列

您可以使用自定义TaskQueue执行基于优先级的队列

如果您想使用TBB,我已经将其与OpenMP一起使用,并且它似乎很好地融合在一起。另外,您不需要担心并发容器。与人们可以使用的其他实现相比,它非常可靠


希望这有帮助。

您真的需要一个int来指定优先级吗?在我唯一需要优先级队列的时候,只有很少的优先级(比如3!)。将优先级范围限制在一个较小的数字可以使优先级队列的设计更加容易。是的,我们可以使用基数。但不幸的是,我们需要的不仅仅是
3
prios,但这不是问题所在。基数10?10正常-在优先级队列ctor中,创建一个包含10个队列的数组。当生产者推送时,锁定优先级队列,将作业添加到优先级寻址的专用队列数组中,解锁优先级队列并发出信号。当消费者出现时,等待信号量,然后锁定优先级队列并从最高优先级迭代私有队列数组。结束,查找非空队列。当使用者在数组中找到一个非空队列时,它可以从中弹出作业,解锁优先级队列并对其进行处理。@Martin:我们已经实现了所有这些。这不是问题,但谢谢。在这种情况下,很难看出您当前的设计还没有满足您的场景的哪些方面,TBB或任何其他框架可以提供很多改进。您是否发现了任何特定的瓶颈?但是当内核“执行(取消)锁定”所花费的时间与实际处理时间相比微不足道时,TBB无法提供更多的东西,即使理论上是这样,对吗?这仍然取决于锁是否阻塞,即等待获取锁的线程是否处于睡眠状态。在这种情况下,如果要在锁内执行的操作非常小,可能会导致性能下降,因为上下文切换太慢。我提到的tbb锁使用忙旋转,因此线程在等待锁时不会放弃CPU。