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

标签 c++ macros parallel.for

我正在使用本地函数定义来运行代码块 N 次,就像 C# 的并行版本一样,但是当我使用两个或多个它在同一范围内。如何在同一范围内每次使用后递增更改函数名称,例如 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;
});

关于C++:如何在同一范围内多次使用 parallel-for 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45113250/

相关文章:

macros - "macro annotations embedding in comments"在mcpp中是什么意思?

c++ - 在 C++ 中解释 #define PRINTF if(false) printf

c - 有没有更好的 MACRO 来获得 2^n (1 << n) 的恒定功率值

c# - Parallel.For 与 for 循环相反

c# - 将 for 循环更改为 Parallel.For 循环

c++ - 程序在函数重载中的工作

c++ - 我不明白在C++11中如何实现乐观并发

c++ - 如何初始化二维字符数组

c++ - 具有单个 char 数组成员的结构是否保证具有可预测的大小?

c - OpenMP Parallel 用于在 C 中进行调度