cpputil/include/threadpool.h

58 lines
1.3 KiB
C++

#ifndef _THREADPOOL_H_
#define _THREADPOOL_H_
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <queue>
#include <vector>
#include <future>
class threadpool
{
private:
std::size_t _concurrency;
std::queue<std::function<void()>> _queue;
std::mutex _mutex;
std::condition_variable _cv;
std::condition_variable _wait_cv;
std::vector<std::thread> _workers;
bool _enabled;
std::atomic<std::size_t> _tasksCount;
public:
threadpool();
threadpool(std::size_t concurrency);
~threadpool();
void wait_all();
template <typename R> std::future<R> add_task(std::function<R()> func)
{
std::lock_guard<std::mutex> lock(_mutex);
std::shared_ptr<std::packaged_task<R()>> pt_ptr = std::make_shared<std::packaged_task<R()>>(func);
std::future<R> fut = pt_ptr->get_future();
_queue.push([pt_ptr] { (*pt_ptr)(); });
_tasksCount++;
_cv.notify_one();
return fut;
}
template <typename R, typename... Args> std::future<R> add_task(R(*pfn)(Args...), Args... args)
{
return add_task<R>(std::bind(pfn, args...));
}
template <typename R, typename C, typename... Args> std::future<R> add_task(R(C::*pfn)(Args...), C* cPtr, Args... args)
{
return add_task<R>(std::bind(pfn, cPtr, args...));
}
private:
void worker_func();
};
#endif // _THREADPOOL_H_