58 lines
1.3 KiB
C++
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_
|