25 #include <condition_variable>
30 #include <type_traits>
37 template<
class F,
class... Args>
38 auto enqueue(F&& f, Args&&... args)
39 -> std::future<
typename std::invoke_result<F, Args...>::type>;
71 return std::thread::hardware_concurrency();
78 std::queue<std::function<void()>>
tasks;
85 std::map<std::thread::id, size_t>
id_map;
98 for(
size_t i = 0; i < threads; ++i)
102 std::function<void()> task;
105 std::unique_lock<std::mutex> lock(this->queue_mutex);
106 this->condition.wait(lock,
107 [this] { return this->stop || !this->tasks.empty(); });
108 if(this->stop && this->tasks.empty())
110 task = std::move(this->tasks.front());
117 size_t thread_count = 0;
118 for(std::thread& worker : workers)
120 id_map[worker.get_id()] = thread_count;
128 CPU_SET(thread_count, &cpuset);
129 int rc = pthread_setaffinity_np(worker.native_handle(),
sizeof(cpu_set_t), &cpuset);
132 std::cerr <<
"Error calling pthread_setaffinity_np: " << rc <<
"\n";
140 template<
class F,
class... Args>
142 -> std::future<
typename std::invoke_result<F, Args...>::type>
144 assert(m_num_threads > 1);
145 using return_type =
typename std::invoke_result<F, Args...>::type;
147 auto task = std::make_shared<std::packaged_task<return_type()>>(
148 std::bind(std::forward<F>(f), std::forward<Args>(args)...));
150 std::future<return_type> res = task->get_future();
152 std::unique_lock<std::mutex> lock(queue_mutex);
156 throw std::runtime_error(
"enqueue on stopped ThreadPool");
158 tasks.emplace([task]() { (*task)(); });
160 condition.notify_one();
172 for(std::thread& worker :
workers)
Definition: ThreadPool.hpp:34
bool stop
Definition: ThreadPool.hpp:83
static ThreadPool * singleton
Definition: ThreadPool.hpp:88
static uint32_t hardware_concurrency()
Definition: ThreadPool.hpp:69
size_t m_num_threads
Definition: ThreadPool.hpp:86
static void release()
Definition: ThreadPool.hpp:63
auto enqueue(F &&f, Args &&... args) -> std::future< typename std::invoke_result< F, Args... >::type >
Definition: ThreadPool.hpp:141
~ThreadPool()
Definition: ThreadPool.hpp:165
size_t num_threads()
Definition: ThreadPool.hpp:47
std::condition_variable condition
Definition: ThreadPool.hpp:82
int thread_number(std::thread::id id)
Definition: ThreadPool.hpp:41
static std::mutex singleton_mutex
Definition: ThreadPool.hpp:89
std::vector< std::thread > workers
Definition: ThreadPool.hpp:76
std::map< std::thread::id, size_t > id_map
Definition: ThreadPool.hpp:85
static ThreadPool * instance(uint32_t numthreads)
Definition: ThreadPool.hpp:56
ThreadPool(size_t)
Definition: ThreadPool.hpp:93
std::mutex queue_mutex
Definition: ThreadPool.hpp:81
std::queue< std::function< void()> > tasks
Definition: ThreadPool.hpp:78
static ThreadPool * get()
Definition: ThreadPool.hpp:52