C ++: как я могу использовать параллельный для макроса несколько раз в той же области?

Я использую определение локальной функции для запуска блока кода 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

обычно добавляя {\ а также }\ решил бы для последующих вызовов, но что если я сделаю вложенную параллель для?

0

Решение

Хотя это не кажется мне идеальным решением, вы можете объединить строки в макросах, используя ##, В вашем коде сделайте следующее

#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

Теперь вам нужно передать индекс для каждого использования.

2

Другие решения

Вместо того, чтобы передавать уникальный идентификатор, вы можете использовать __LINE__,

Но вместо уродливого макроса, почему бы вам не использовать функцию с лямбдой?

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;
});

Лямбда может захватывать переменные, которые вам нужны:

int j = ...;
parallel_for<5>([j] (int i) {
std::cout<<100*(i+j)<<std::endl;
});
5

По вопросам рекламы [email protected]