UsenetSearch/include/usenetsearch/ThreadPool.h

52 lines
1.4 KiB
C++

/*
Copyright© 2021 John Sennesael
UsenetSearch is Free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
UsenetSearch 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with UsenetSearch. If not, see <https://www.gnu.org/licenses/>.
*/
#pragma once
#include <atomic>
#include <functional>
#include <future>
#include <thread>
#include <unordered_map>
#include <vector>
namespace usenetsearch {
class ThreadPool
{
typedef std::unordered_map<std::thread::id, bool> ThreadStates;
typedef std::vector<std::unique_ptr<std::thread>> Threads;
size_t m_maxThreads{2};
std::atomic<bool> m_stopping{false};
Threads m_threads;
std::mutex m_threadsMutex;
std::shared_ptr<ThreadStates> m_threadStates;
std::mutex m_threadStatesMutex;
public:
ThreadPool();
ThreadPool(const ThreadPool&) = delete;
~ThreadPool();
void JoinThreads();
void MaxThreads(std::uint16_t max);
void Queue(std::function<void()> fn);
};
} // namespace usenetsearch