C++:如何在同一范围内多次使用parallel-for宏?

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)

通常加入{\}\将解决随之而来的电话,但如果我这样做了嵌套并行?

O'N*_*eil 5

您可以使用,而不是传递唯一的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)

  • 这比使用宏要好。使用函数来做到这一点比使用这样一个丑陋的宏要优雅得多 (2认同)