[英]C++: how can I use parallel-for macro multiple times in same scope?
我正在使用局部函数定义来运行代码块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
用法:
PARALLEL_FOR(
5,
{std::cout<<100*i<<std::endl;}
);
输出:
0
300
200
100
400
通常添加{\\
和}\\
可以解决随后的调用,但是如果我为之并行嵌套怎么办?
您可以使用__LINE__
而不是传递唯一的ID。
但是,为什么不使用带有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();
}
}
像这样使用:
parallel_for<5>([] (int i) {
std::cout<<100*i<<std::endl;
});
lambda可以捕获您需要的变量:
int j = ...;
parallel_for<5>([j] (int i) {
std::cout<<100*(i+j)<<std::endl;
});
尽管这对我来说似乎不是理想的解决方案,但是您可以使用##
宏中的字符串连接起来。 在您的代码中执行以下操作
#ifndef PARALLEL_FOR
#define PARALLEL_FOR(N,O,usageInd) \
struct LocalClass##usageInd \
{ \
void operator()(int i) const O \
} f##usageInd; \
std::thread threads[N]; \
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) \
{ \
threads[loopCounterI]=std::thread(f##usageInd,loopCounterI); \
} \
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) \
{ \
threads[loopCounterI].join(); \
} \
#endif
现在,您将需要为每种用法传递一个索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.