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

Пул потоков Подробнее...

#include <pithreadpoolloop.h>

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

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

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

Пул потоков

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

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

Этот класс предназначен для распараллеливания цикла "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:34
void exec(int index_start, int index_count)
Начинает исполнение потоков с аргументами по диапазону от "index_start" до "index_start + index_count...
Definition: pithreadpoolloop.cpp:159
#define piCout
Макрос для условного (piDebug) вывода в PICout(StdOut)
Definition: picout.h:35

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

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)
Устанавливает функцию потоков на лямбда-выражение "f" в формате [ ](int){ ... }.
Definition: pithreadpoolloop.cpp:138

Важно

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