20 #ifndef _ANCH_THREAD_POOL_H_ 21 #define _ANCH_THREAD_POOL_H_ 49 std::queue<std::function<void()> > _threads;
55 unsigned int _maxThreads;
58 std::atomic<unsigned int> _available;
77 _maxThreads = std::thread::hardware_concurrency();
78 if(_maxThreads == 0) {
82 _maxThreads = maxThreads;
95 while(!_threads.empty()) {
108 std::lock_guard<std::mutex> lock(_mutex);
110 _available.store(_maxThreads);
113 while(_available.load() > 0 && !_threads.empty()) {
115 std::thread exec(&ThreadPool::execute,
this, _threads.front());
127 std::lock_guard<std::mutex> lock(_mutex);
131 while(_available.load() != _maxThreads) {
132 std::this_thread::sleep_for(std::chrono::milliseconds(50));
143 template<
typename Func,
typename... Args>
144 void add(Func
function, Args... args) {
145 std::lock_guard<std::mutex> lock(_mutex);
147 if(_available.load() > 0 && _threads.size() < _maxThreads) {
149 std::thread exec(&ThreadPool::execute,
this,
static_cast<std::function<void()>
>(std::bind(
function, args...)));
152 _threads.push(std::bind(
function, args...));
156 _threads.push(std::bind(
function, args...));
166 void execute(std::function<
void()> func) {
174 if(_running && _available.load() > 0 && !_threads.empty()) {
176 std::thread exec(&ThreadPool::execute,
this, _threads.front());
188 #endif // _ANCH_THREAD_POOL_H_ ThreadPool(unsigned int maxThreads=0)
Definition: threadPool.hpp:71
Thread pool utility class.
Definition: threadPool.hpp:45
AnCH framework base namespace.
Definition: base64.hpp:28
virtual ~ThreadPool()
Definition: threadPool.hpp:92
void start()
Definition: threadPool.hpp:107
void add(Func function, Args...args)
Definition: threadPool.hpp:144
void stop()
Definition: threadPool.hpp:126