83 lines
4.1 KiB
C++
83 lines
4.1 KiB
C++
//! \~\file pithreadpoolloop.h
|
||
//! \~\ingroup Thread
|
||
//! \~\brief
|
||
//! \~english Parallel loop helper
|
||
//! \~russian Вспомогательный класс для параллельного цикла
|
||
/*
|
||
PIP - Platform Independent Primitives
|
||
Thread pool loop
|
||
Ivan Pelipenko peri4ko@yandex.ru
|
||
|
||
This program is free software: you can redistribute it and/or modify
|
||
it under the terms of the GNU Lesser General Public License as published by
|
||
the Free Software Foundation, either version 3 of the License, or
|
||
(at your option) any later version.
|
||
|
||
This program is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU Lesser General Public License for more details.
|
||
|
||
You should have received a copy of the GNU Lesser General Public License
|
||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
*/
|
||
|
||
#ifndef PITHREADPOOLLOOP_H
|
||
#define PITHREADPOOLLOOP_H
|
||
|
||
#include "pisemaphore.h"
|
||
#include "pivector.h"
|
||
|
||
class PIThread;
|
||
|
||
//! \~\ingroup Thread
|
||
//! \~\brief
|
||
//! \~english Helper that runs one integer range across a fixed set of worker threads.
|
||
//! \~russian Вспомогательный класс, который выполняет один целочисленный диапазон на фиксированном наборе рабочих потоков.
|
||
class PIP_EXPORT PIThreadPoolLoop {
|
||
public:
|
||
//! \~english Constructs parallel loop runner with \a thread_cnt worker threads. If \a thread_cnt is less than or equal to zero, the
|
||
//! processor count is used.
|
||
//! \~russian Создает исполнитель параллельного цикла с \a thread_cnt рабочими потоками. Если \a thread_cnt меньше либо равен нулю,
|
||
//! используется количество процессоров.
|
||
PIThreadPoolLoop(int thread_cnt = -1);
|
||
|
||
//! \~english Stops worker threads and destroys the loop runner.
|
||
//! \~russian Останавливает рабочие потоки и уничтожает исполнитель цикла.
|
||
virtual ~PIThreadPoolLoop();
|
||
|
||
//! \~english Sets the iteration body called once for each index of a started range.
|
||
//! \~russian Устанавливает тело итерации, которое вызывается один раз для каждого индекса запущенного диапазона.
|
||
void setFunction(std::function<void(int)> f);
|
||
|
||
//! \~english Waits for the current in-flight batch started by \a start().
|
||
//! \~russian Ожидает завершения текущего запущенного пакета, начатого через \a start().
|
||
void wait();
|
||
|
||
//! \~english Starts asynchronous execution for indices in range [\a index_start, \a index_start + \a index_count).
|
||
//! \~russian Запускает асинхронное выполнение для индексов из диапазона [\a index_start, \a index_start + \a index_count).
|
||
void start(int index_start, int index_count);
|
||
|
||
//! \~english Runs the configured iteration body for indices in range [\a index_start, \a index_start + \a index_count) and waits for
|
||
//! completion.
|
||
//! \~russian Выполняет настроенное тело итерации для индексов из диапазона [\a index_start, \a index_start + \a index_count) и ожидает
|
||
//! завершения.
|
||
void exec(int index_start, int index_count);
|
||
|
||
//! \~english Sets iteration body to \a f, runs it for indices in range [\a index_start, \a index_start + \a index_count), and waits for
|
||
//! completion.
|
||
//! \~russian Устанавливает тело итерации \a f, выполняет его для индексов из диапазона [\a index_start, \a index_start + \a
|
||
//! index_count) и ожидает завершения.
|
||
void exec(int index_start, int index_count, std::function<void(int)> f);
|
||
|
||
private:
|
||
PIVector<PIThread *> threads;
|
||
std::function<void(int)> func;
|
||
PISemaphore sem_exec, sem_done;
|
||
std::atomic_bool is_destroy = {false};
|
||
std::atomic_int counter = {0}, wait_count = {0};
|
||
};
|
||
|
||
|
||
#endif
|