- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想用 C++ 执行后序树遍历。树可能很深以至于我无法使用递归(它耗尽了堆栈)。相反,我创建了一个 std::stack<...>
将所有内容都放在堆上,并在 while 循环中遍历树,而不是使用函数调用。这很好用。
现在我想使用 TBB 并行化整个过程。我正在考虑创建一个 task_group
在每个节点,并运行相同的 functor
在它的每个 child 身上。但我突然想到,这会遇到与我之前遇到的树深度相同的问题:运行 functor
在最深路径的每个节点上都会从堆栈中吃掉一些东西,直到整个东西用完。
有没有办法解决这个问题?还是我在想象整个事情? task_group::wait()
背后有什么魔法吗?那避免了这个问题?
最佳答案
来自 TBB 文档(关于隐式延续):
Because the parent blocks, its thread’s stack cannot be popped yet. The thread must be careful about what work it takes on, because continually stealing and blocking could cause the stack to grow without bound.
这不完全是关于那个,但它表明 TBB 没有使用任何堆栈魔术来为当前阻塞的任务清空堆栈。这意味着当使用隐式延续时,您稍后会遇到堆栈溢出(分布在多个线程的堆栈中)。
使用显式延续可能会解决问题,但这在很大程度上取决于线程调度程序的内部 TBB 实现(未记录)。它很有可能会正常工作 - 唯一知道的方法是查看 TBB 源代码并查看任务是如何处理的,或者编写简单的小堆栈测试程序并查看是否有一些简单的东西能够耗尽它。
关于c++ - 不使用堆栈的 TBB task_groups,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7759512/
我想用 C++ 执行后序树遍历。树可能很深以至于我无法使用递归(它耗尽了堆栈)。相反,我创建了一个 std::stack将所有内容都放在堆上,并在 while 循环中遍历树,而不是使用函数调用。这很好
我想用 ppl 的 task_group 类替换普通线程的使用,但我遇到了以下问题: 我有一个 task_group 成员的 A 类, 创建类 A 的 2 个不同实例, 在第一个A实例的task_gr
我正在尝试在正在运行的任务中使用 tbb::concurrent_hash_map,但我遇到了调用 map 的 erase() 导致任务无限锁定的问题。你知道下面的代码片段有什么问题吗? #inclu
我正在使用英特尔 TBB 实现双调排序。使用 parallel_invoke 方法时一切顺利。但是当使用 task_group(不调用 wait 方法)时,输出没有排序。当如下使用 task_grou
我在 Visual C++ 2010 中使用并发运行时,并且对 parallel_invoke 的功能感兴趣和 task_group (PPL 的一部分或 Parallel Patterns Libr
我正在尝试使用 Threaded Building Blocks task_arena。有一个充满'0'的简单数组。 Arena 的线程将“1”放入数组中的奇数位置。主线程将 '2' 放入数组中的偶数
我有代码,我必须同时并行运行 parallel_for(彼此独立)。 代码是这样的: tbb::parallel_for(range1,func1());//first tbb::parallel_f
我最近对英特尔线程构建模块产生了兴趣。我想利用 tbb::task_group 类来管理线程池。 我的第一次尝试是构建一个测试,其中一个 vector 复制到另一个 vector 中:我创建了第 n
*** 更新:将代码更改为重现问题的真实案例 *** 我正在处理一些使用多种多线程技术的预先存在的代码; std::thread,加上英特尔 TBB 任务组,加上 OpenMP。 🙄 看起来我在 s
我是一名优秀的程序员,十分优秀!