85 lines
3.2 KiB
C++
85 lines
3.2 KiB
C++
//! \file pithreadpoolexecutor.h
|
||
//! \ingroup Thread
|
||
//! \brief
|
||
//! \~english Thread pool executor
|
||
//! \~russian Исполнитель пула потоков
|
||
//!
|
||
//! \details
|
||
//! \~english Executes tasks in a pool of worker threads.
|
||
//! \~russian Выполняет задачи в пуле рабочих потоков.
|
||
/*
|
||
PIP - Platform Independent Primitives
|
||
|
||
Stephan Fomenko
|
||
|
||
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 PITHREADPOOLEXECUTOR_H
|
||
#define PITHREADPOOLEXECUTOR_H
|
||
|
||
#include "piblockingqueue.h"
|
||
#include "pithread.h"
|
||
|
||
#include <atomic>
|
||
|
||
|
||
//! \~english Thread pool executor for running tasks
|
||
//! \~russian Исполнитель пула потоков для выполнения задач
|
||
class PIP_EXPORT PIThreadPoolExecutor {
|
||
public:
|
||
//! \~english Constructs executor with core pool size
|
||
//! \~russian Создает исполнитель с размером ядра пула
|
||
explicit PIThreadPoolExecutor(int corePoolSize);
|
||
|
||
//! \~english Destroys executor
|
||
//! \~russian Уничтожает исполнитель
|
||
virtual ~PIThreadPoolExecutor();
|
||
|
||
//! \brief Executes the given task sometime in the future. The task execute in an existing pooled thread. If the task
|
||
//! cannot be submitted for execution, either because this executor has been shutdown or because its capacity has been
|
||
//! reached.
|
||
//!
|
||
//! \param runnable not empty function for thread pool execution
|
||
//! \~english Execute task in thread pool
|
||
//! \~russian Выполняет задачу в пуле потоков
|
||
void execute(const std::function<void()> & runnable);
|
||
|
||
//! \~english Stop all threads immediately
|
||
//! \~russian Немедленно останавливает все потоки
|
||
void shutdownNow();
|
||
|
||
//! \brief Initiates an orderly shutdown in which previously submitted tasks are executed, but no new tasks will be
|
||
//! accepted. Invocation has no additional effect if already shut down. This method does not wait for previously
|
||
//! submitted tasks to complete execution. Use awaitTermination to do that.
|
||
//! \~english Initiates orderly shutdown
|
||
//! \~russian Инициирует упорядоченное завершение
|
||
void shutdown();
|
||
|
||
//! \~english Returns if executor is shutdown
|
||
//! \~russian Возвращает остановлен ли исполнитель
|
||
bool isShutdown() const;
|
||
|
||
//! \~english Wait for termination
|
||
//! \~russian Ожидает завершения
|
||
bool awaitTermination(PISystemTime timeout);
|
||
|
||
private:
|
||
std::atomic_bool isShutdown_;
|
||
PIBlockingQueue<std::function<void()>> taskQueue;
|
||
PIVector<PIThread *> threadPool;
|
||
};
|
||
|
||
#endif // PITHREADPOOLEXECUTOR_H
|