c++ - tbb::parallel_for 是否总是利用调用线程

标签 c++ multithreading c++11 tbb parallel.for

我有一段代码,我正在使用 tbb::parallel_for 对一个循环进行多线程处理,该循环由主线程调用。在那个循环中,我需要主线程来更新 UI 以反射(reflect)进度。据我观察,tbb::parallel_for 总是使用调用者线程 + N 个工作线程。但是,我想知道调用线程的使用是否得到保证,或者只是恰好如此?

示例代码如下:

static thread_local bool _mainThread = false;  // false in all threads
_mainThread = true;                            // now true in main thread, but false in others
tbb::parallel_for(start, end, *this);

void Bender::processor::operator()(size_t i) const
{
...
            if(_mainThread)                     // only main thread will issue events
                ProgressUpdatedEvent(progress);
}

谢谢!

最佳答案

严格来说,我认为 TBB 不能保证任何给定线程应该运行什么(TBB 的基本原则是可选的并行性和随机工作窃取)。甚至 TBB 中的任务亲和性也是“软”的,因为它不能保证特定的 worker 可以接受亲和任务。

实际上,parallel_for 的实现方式意味着它将至少运行一个任务,然后再切换到其他任务并退出 parallel_for。因此,至少对于简单的情况,预计它会工作得足够好。

关于c++ - tbb::parallel_for 是否总是利用调用线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43551402/

相关文章:

c# - 我应该使用 ManualResetEvent 作为锁定对象吗?

java - 如何从java中的线程返回一个值?

c++ - 比较 v8 字符串(Node.js 插件)

c++ - 试图确定算法的目标

java - 该 Java 程序没有显示预期的死锁

c++ - 子类中的默认 move 构造函数

c++ - 正则表达式无法按预期使用 C++ regex_match

c++ - C++ 中的延迟评估包装类?

c++ - CMake:将 libgcc 和 libstdc++ 静态链接到共享库中

c++ - 初始化字符串时额外的大括号