PIP 5.6.1
Platform-Independent Primitives
Открытые члены | Полный список членов класса
Класс PIThreadPoolLoop

Вспомогательный класс, который выполняет один целочисленный диапазон на фиксированном наборе рабочих потоков. Подробнее...

#include <pithreadpoolloop.h>

Открытые члены

 PIThreadPoolLoop (int thread_cnt=-1)
 Создает исполнитель параллельного цикла с thread_cnt рабочими потоками. Если thread_cnt меньше либо равен нулю, используется количество процессоров.
 
virtual ~PIThreadPoolLoop ()
 Останавливает рабочие потоки и уничтожает исполнитель цикла.
 
void setFunction (std::function< void(int)> f)
 Устанавливает тело итерации, которое вызывается один раз для каждого индекса запущенного диапазона.
 
void wait ()
 Ожидает завершения текущего запущенного пакета, начатого через start().
 
void start (int index_start, int index_count)
 Запускает асинхронное выполнение для индексов из диапазона [index_start, index_start + index_count).
 
void exec (int index_start, int index_count)
 Выполняет настроенное тело итерации для индексов из диапазона [index_start, index_start + index_count) и ожидает завершения.
 
void exec (int index_start, int index_count, std::function< void(int)> f)
 Устанавливает тело итерации f, выполняет его для индексов из диапазона [index_start, index_start + index_count) и ожидает завершения.
 

Подробное описание

Вспомогательный класс, который выполняет один целочисленный диапазон на фиксированном наборе рабочих потоков.

Пул потоков

Этот класс позволяет распараллелить цикл

Использование

Этот класс предназначен для распараллеливания цикла "for(;;)" максимально простым способом. В конструкторе создается несколько потоков, затем методом setFunction() устанавливается функция, представляющая собой тело цикла. Затем вызовом start() или exec() цикл исполняется параллельно. Каждый поток получает значение переменной цикла и вызывает функцию-тело до тех пор, пока весь диапазон не будет исполнен.

Пример:

PIVector<int> data(10, [](int i)->int{return i;});
piCout << data; // {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
pool.exec(0, data.size(), [&](int i){ // parallel analogue "for (int i = 0; i < data.size(); i++)"
data[i] = data[i] + 10;
});
piCout << data; // {10, 11, 12, 13, 14, 15, 16, 17, 18, 19}
Вспомогательный класс, который выполняет один целочисленный диапазон на фиксированном наборе рабочих ...
Definition: pithreadpoolloop.h:37
void exec(int index_start, int index_count)
Выполняет настроенное тело итерации для индексов из диапазона [index_start, index_start + index_count...
Definition: pithreadpoolloop.cpp:159
#define piCout
Definition: picout.h:36

Эквивалентно:

PIVector<int> data(10, [](int i)->int{return i;});
piCout << data; // {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
pool.setFunction([&](int i){
data[i] = data[i] + 10;
});
pool.exec(0, data.size());
piCout << data; // {10, 11, 12, 13, 14, 15, 16, 17, 18, 19}
void setFunction(std::function< void(int)> f)
Устанавливает тело итерации, которое вызывается один раз для каждого индекса запущенного диапазона.
Definition: pithreadpoolloop.cpp:138

Важно

В силу многопоточности очень важно защитить выходные данные тела цикла с помощью блокировок (мьютекса). Также стоит помнить, что последовательность выполнения неопределена, и не стоит использовать глобальных переменных в теле цикла. Используйте локальные переменные и захват в лямбде.