TBB task_groups不使用堆栈
TBB task_groups without using stack
我想在c++中执行一个后序树遍历。树可能很深,以至于我不能使用递归(它会耗尽堆栈)。相反,我创建了一个std::stack<...>
,它将所有内容放在堆上,并在while循环中遍历树,而不是使用函数调用。
现在我想使用TBB并行化整个过程。我正在考虑在每个节点上创建一个task_group
,并在每个子节点上运行相同的functor
。但是我突然想到,这将遇到与我之前的树深度相同的问题:在最深路径的每个节点上运行functor
将从堆栈中吃掉一些东西,直到整个东西用完。
有办法解决这个问题吗?或者整个事情都是我想象出来的;task_group::wait()
背后有什么魔法可以避免这个问题吗?
来自TBB文档(关于隐式延续):
因为父线程阻塞,它的线程堆栈还不能弹出。线程必须小心它所做的工作,因为不断地窃取和阻塞可能会导致堆栈增长没有绑定。
这并不完全是关于那个,但它表明TBB没有使用任何堆栈魔法来清空当前阻塞任务的堆栈。这意味着当使用隐式延续时,稍后会出现堆栈溢出(分布在多个线程的堆栈中)。
使用显式延续可能解决问题,但这在很大程度上取决于线程调度器的内部TBB实现(没有文档记录)。有一个公平的机会,它将正确地工作-唯一的方法是查看TBB源代码,看看任务是如何处理的,或编写简单的测试程序与小堆栈,看看是否简单的东西将能够耗尽它。
只是一个注释,验证您需要为此使用延续。task_group::wait没有什么神奇的东西可以阻止它消耗堆栈。
task_group在PPL中,您可以使用MSDN博客中描述的任务延续,并在PPL示例包中提供。
相关文章:
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 堆栈中大小变量输入错误 (C++)
- 堆栈问题(平衡表达式问题集)
- C++ 在堆栈中包含多态属性的类对象存储
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 在 C++ 中使用链表进行堆栈
- 变量周围的堆栈'...'已损坏
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- C++线程的可用堆栈大小