关于 c :TBB task_arena
TBB task_arena & task_group usage for scaling parallel_for work
我正在尝试使用 Threaded Building Blocks task_arena。有一个充满"0"的简单数组。 Arena 的线程将"1"放入数组中的奇数位置。主线程将'2'放在偶数位置的数组中。
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
/* Odd-even arenas tbb test */
#include <tbb/parallel_for.h> #include <tbb/blocked_range.h> #include <tbb/task_arena.h> #include <tbb/task_group.h> #include <iostream> using namespace std; const int SIZE = 100; int main() int myArray[SIZE] = {0}; //! Main thread create another thread, then immediately returns //! Main thread do this work //! Main thread waiting for 'tg' group for(int i = 0; i < SIZE; i++) { return 0; |
输出是:
0 2 0 2 ... 0 2
所以 limited.enque{tg.run{...}} 块不起作用。
有什么问题?有任何想法吗?谢谢。
你只为一个线程创建了
因此,为了等待
如果想看异步执行,手动设置arena的并发为2:
或禁用主线程的插槽保留:
附言TBB 没有保证线程来的点(与 OpenMP 不同)。只有
相关讨论
- 谢谢你,Антон!所以,我是对的吗,有两种方法:(1)使用
tbb::task_arena limited(1) /*enqueue will enhance concurrency level from 1 to 2*/ 然后limited.enqueue{tg.run{/* some work */ flag = 1;}} 但接下来(对于主线程)类似于while(flag) tg.wait(); /* yes, it is active waiting, but, according to your answer, there is no way to force main thread to wait for tg to finish its work, because the time, when tg.run will actually start is unpredictable. Isn't it?*/ (2)使用tbb::task_arena limited(2) 然后limited.execute{tg.run{...}} nexttg.wait() - 是的,这是正确的。只是不要忘记将标志声明为原子