Я использую определение локальной функции для запуска блока кода 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
обычно добавляя {\
а также }\
решил бы для последующих вызовов, но что если я сделаю вложенную параллель для?
Хотя это не кажется мне идеальным решением, вы можете объединить строки в макросах, используя ##
, В вашем коде сделайте следующее
#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
Теперь вам нужно передать индекс для каждого использования.
Вместо того, чтобы передавать уникальный идентификатор, вы можете использовать __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;
});