hus*_*sik 0 c++ macros parallel-for
我正在使用本地函数定义来运行代码块N次,就像C#的并行版本一样,但是f当我在同一范围内使用两个或更多个函数时,它会给函数带来多个定义错误.如何在相同范围内每次使用后逐步更改功能名称,如f1,f2,f3,..
定义:
#ifndef PARALLEL_FOR
#define PARALLEL_FOR(N,O) \
struct LocalClass \
{ \
void operator()(int i) const O \
} f; \
std::thread threads[N]; \
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) \
{ \
threads[loopCounterI]=std::thread(f,loopCounterI); \
} \
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) \
{ \
threads[loopCounterI].join(); \
} \
#endif
Run Code Online (Sandbox Code Playgroud)
用法:
PARALLEL_FOR(
5,
{std::cout<<100*i<<std::endl;}
);
Run Code Online (Sandbox Code Playgroud)
输出:
0
300
200
100
400
Run Code Online (Sandbox Code Playgroud)
通常加入{\和}\将解决随之而来的电话,但如果我这样做了嵌套并行?
您可以使用,而不是传递唯一的ID __LINE__.
但是,为什么不使用lambda函数而不是丑陋的宏呢?
template <int N, class F>
void parallel_for(F f) {
std::thread threads[N]; // or std::array<std::thread, N> threads;
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) {
threads[loopCounterI]=std::thread(f,loopCounterI);
}
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) {
threads[loopCounterI].join();
}
}
Run Code Online (Sandbox Code Playgroud)
像这样使用:
parallel_for<5>([] (int i) {
std::cout<<100*i<<std::endl;
});
Run Code Online (Sandbox Code Playgroud)
lambda可以捕获您需要的变量:
int j = ...;
parallel_for<5>([j] (int i) {
std::cout<<100*(i+j)<<std::endl;
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |