48 using TYPE = std::function<void(
void)>;
50 std::atomic_int m_jobs_left{0};
51 std::atomic_bool m_running{
true};
53 std::condition_variable m_job_available_var;
54 std::condition_variable m_wait_var;
55 std::mutex m_wait_mutex;
56 std::mutex m_queue_mutex;
58 std::list<TYPE> m_queue;
59 std::vector<std::thread> m_threads;
70 std::unique_lock<std::mutex> lock( m_queue_mutex );
71 while ( m_queue.empty() ) m_job_available_var.wait( lock );
72 job = std::move(m_queue.front());
77 std::unique_lock<std::mutex> lock( m_wait_mutex );
78 if ( --m_jobs_left == 0 ) m_wait_var.notify_one();
89 for(
unsigned i{unsigned(m_threads.size())}; i > 0; --i )
exec( [](){} );
90 for(
auto & t : m_threads )
if( t.joinable() ) t.join();
101 ThreadPool2(
unsigned nthread = std::max(
unsigned(1),
unsigned(std::thread::hardware_concurrency()-1) )) {
103 m_threads.reserve(nthread);
104 for(
unsigned i{0}; i < nthread; ++i )
105 m_threads.emplace_back( [
this]{ this->Task(); } );
120 std::unique_lock<std::mutex> lock( m_queue_mutex );
122 m_queue.emplace_back( std::move(fun) );
123 m_job_available_var.notify_one();
128 std::unique_lock<std::mutex> lock( m_wait_mutex );
129 while ( m_jobs_left > 0 ) m_wait_var.wait( lock );
137 unsigned thread_count()
const override {
return unsigned(m_threads.size()); }
139 static char const *
Name() {
return "ThreadPool2"; }
141 char const *
name()
const override {
return Name(); }
virtual ~ThreadPool2()
Destroys the ThreadPool1 and stops all worker threads.
Definition ThreadPool2.hxx:111
void wait() override
Definition ThreadPool2.hxx:127
static char const * Name()
Returns the name of the thread pool.
Definition ThreadPool2.hxx:139
void exec(FUN &&fun) override
Executes a task in the thread pool.
Definition ThreadPool2.hxx:119
ThreadPool2(unsigned nthread=std::max(unsigned(1), unsigned(std::thread::hardware_concurrency() -1)))
Constructs a new ThreadPool1 with a specified number of threads.
Definition ThreadPool2.hxx:101
unsigned thread_count() const override
Returns the number of threads in the pool.
Definition ThreadPool2.hxx:137
char const * name() const override
Definition ThreadPool2.hxx:141
ThreadPoolBase(ThreadPoolBase const &)=delete
std::function< void(void)> FUN
Definition ThreadPoolBase.hxx:55
Definition SystemUtils.cc:39