1 #ifndef OSMIUM_THREAD_POOL_HPP 2 #define OSMIUM_THREAD_POOL_HPP 39 #include <type_traits> 59 constexpr
const int max_pool_threads = 256;
61 inline int get_pool_size(
int num_threads,
int user_setting,
unsigned hardware_concurrency) {
62 if (num_threads == 0) {
63 num_threads = user_setting ? user_setting : -2;
66 if (num_threads < 0) {
67 num_threads += int(hardware_concurrency);
70 if (num_threads < 1) {
72 }
else if (num_threads > max_pool_threads) {
73 num_threads = max_pool_threads;
79 inline size_t get_work_queue_size() noexcept {
106 for (
auto& thread : m_threads) {
107 if (thread.joinable()) {
125 if (task && task()) {
145 explicit Pool(
int num_threads,
size_t max_queue_size) :
146 m_work_queue(max_queue_size,
"work"),
152 for (
int i = 0; i < m_num_threads; ++i) {
156 shutdown_all_workers();
163 static constexpr
int default_num_threads = 0;
166 static Pool pool(default_num_threads, detail::get_work_queue_size());
171 for (
int i = 0; i < m_num_threads; ++i) {
178 shutdown_all_workers();
182 return m_work_queue.
size();
186 return m_work_queue.
empty();
189 template <
typename TFunction>
194 std::packaged_task<result_type()> task(std::forward<TFunction>(func));
195 std::future<result_type> future_result(task.get_future());
196 m_work_queue.
push(std::move(task));
198 return future_result;
207 #endif // OSMIUM_THREAD_POOL_HPP Pool(int num_threads, size_t max_queue_size)
Definition: pool.hpp:145
type
Definition: entity_bits.hpp:63
size_t size() const
Definition: queue.hpp:219
bool queue_empty() const
Definition: pool.hpp:185
void set_thread_name(const char *name) noexcept
Definition: util.hpp:76
~Pool()
Definition: pool.hpp:177
Definition: reader_iterator.hpp:39
std::vector< std::thread > & m_threads
Definition: pool.hpp:97
std::future< typename std::result_of< TFunction()>::type > submit(TFunction &&func)
Definition: pool.hpp:190
void worker_thread()
Definition: pool.hpp:120
int get_pool_threads() noexcept
Definition: config.hpp:48
static Pool & instance()
Definition: pool.hpp:165
Namespace for everything in the Osmium library.
Definition: assembler.hpp:63
Definition: function_wrapper.hpp:48
std::vector< std::thread > m_threads
Definition: pool.hpp:116
osmium::thread::Queue< function_wrapper > m_work_queue
Definition: pool.hpp:115
thread_joiner(std::vector< std::thread > &threads)
Definition: pool.hpp:101
int m_num_threads
Definition: pool.hpp:118
void wait_and_pop(T &value)
Definition: queue.hpp:170
~thread_joiner()
Definition: pool.hpp:105
size_t queue_size() const
Definition: pool.hpp:181
void push(T value)
Definition: queue.hpp:145
size_t get_max_queue_size(const char *queue_name, size_t default_value) noexcept
Definition: config.hpp:69
bool empty() const
Definition: queue.hpp:214
void shutdown_all_workers()
Definition: pool.hpp:170
thread_joiner m_joiner
Definition: pool.hpp:117