6 #include <condition_variable> 13 template <
class Task >
16 using Result = std::decay_t< decltype( std::declval< Task >()() ) >;
18 struct thread_with_queue_t
25 using size_type =
typename std::vector< thread_with_queue_t >::size_type;
30 for ( size_type i = 0; i < size; ++i )
32 threads_[ i ].thread = std::thread( [
this, i] {
36 std::unique_lock lock{sleep_mutex_};
37 sleep_condition_.wait( lock, [
this] {
return !sleeping_; } );
40 const auto task = threads_[ i ].task_queue.try_pop();
43 threads_[ i ].result_queue.push( ( *task )() );
54 sleep_condition_.notify_all();
55 for (
auto& entry : threads_ )
63 return threads_[ idx ].task_queue;
68 return threads_[ idx ].result_queue;
73 std::lock_guard lock{sleep_mutex_};
79 std::lock_guard lock{sleep_mutex_};
81 sleep_condition_.notify_all();
85 std::vector< thread_with_queue_t > threads_;
86 std::condition_variable sleep_condition_;
87 std::mutex sleep_mutex_;
89 std::atomic_bool stopped_{
false};
~thread_pool_t()
Definition: thread_pool.hpp:50
thread_pool_t(size_type size)
Definition: thread_pool.hpp:28
auto & task_queue(size_type idx) noexcept
Definition: thread_pool.hpp:61
Definition: thread_pool.hpp:14
void start()
Definition: thread_pool.hpp:77
void stop()
Definition: thread_pool.hpp:71
auto & result_queue(size_type idx) noexcept
Definition: thread_pool.hpp:66