TBB vs.本地工作队列
TBB vs. Homegrown Workqueue
我知道TBB
(线程构建块)声称有一个复杂的引擎,但从算法的角度来看:
如果我们有(在Linux上说)一个工作队列,有N
工作线程(POSIX线程,N
是内核的数量)和一个互斥同步的任务队列,每个工作线程然后从队列中取出一个任务,当空闲时,还有一些同步调用,TBB
还能提供什么,不算好的C++
语法?我认为没有比贪婪分配任务更好的算法了。
作为一个开发了自己的偷工作调度程序的人,我可以这样说:
- 不要编写自己的调度器(这里有一个工作队列计数)。 你要么做得效率低下,要么做得不对。
实际上,编写一个正确的调度程序并不难。不幸的是,如果你想高效地完成它,是很难的。一个高效的调度器有效地排除了锁的使用(除非在非常特定的、明确指定的情况下),而无锁的跨线程通信是一个痛苦的世界。
作为一个轶事,我实际上实现了一个调度程序,我基本上必须将复制现有算法到代码中,并且我仍然设法在代码中引入几乎任何可以想象的竞争条件。调试这段代码是一个混合的- 编写巨大的,复杂的测试用例(只是为了找出只发生在<1%的运行),
- 花几个小时盯着代码,试图通过应用逻辑 找出错误
- 跟踪调试器中的每一行(如果没有堆栈跟踪,一旦发生错误就会崩溃),手动跟踪所有线程中所有变量的状态,以确保程序的实际状态与预期状态相匹配
- 将代码减少几次,基本上为零并重新构建,注释掉单行或对行以查看效果(巨大的组合空间),以及
- 撞墙跑,头朝前。
不知道TBB的确切实现,我不能确切地说它提供了什么,但既然你说"可以提供什么"…
其中
- 它可以提供无锁的排队和取消排队,而不是每个任务一个系统调用和上下文切换。这比听起来更难实现。
- 此外,如果队列为空,它可以阻塞工作线程。这也比听起来更难实现。
- 它可以提供工作窃取。
- 它可以提供LIFO任务到线程的分配,与Windows完成端口的工作方式相同(提高缓存效率)。
- 它可能没有bug。这又是一件比你想象的更难实现的事情。
相关文章:
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 优先级队列构造函数的工作
- 代码在Visual Studio 2017中不起作用,但在VS代码中工作
- VS 代码 C/C++ 智能感知在更新后停止工作
- 如何将 IAudioClient3 (WASAPI) 与实时工作队列 API 结合使用
- QtThread:I/O 队列的工作线程
- 设置 ACL,指定允许在请求队列上接收 I/O 的工作进程
- VS为我提供了对构造函数的另一个解决方案,但我想知道为什么我的工作不起作用
- std::get_time 在 VS 2017 中无法正常工作
- 优先队列中比较函数的工作
- 使用C++的内置队列类在我创建的类中工作
- Deque vs队列速度
- 在 C++11 中,lambda 队列是否是工作队列的良好设计模式
- 工作线程队列的这种变体是某种模式或通用结构吗?
- 为什么这个文件不能在 gcc 中编译?它在 VS 中工作正常
- 如何使Ws2_32.lib与针对Windows 8.1的VS 2013项目协同工作
- Cstring 在 VS 2012 中不起作用,但如果使用 VS 2012 打开 VC++ 6.0 项目,则可以工作
- posix管道作为工作队列
- 带有阻塞的c++工作队列
- TBB vs.本地工作队列