diff --git a/src/common/threads_pool.h b/src/common/threads_pool.h index 235e48ec..4e4e3905 100644 --- a/src/common/threads_pool.h +++ b/src/common/threads_pool.h @@ -13,7 +13,7 @@ namespace utils struct call_executor_base { - virtual void execute()=0; + virtual void execute() = 0; }; template @@ -28,7 +28,7 @@ namespace utils } }; - template + template std::shared_ptr build_call_executor(t_executor_func func) { std::shared_ptr res(static_cast(new call_executor_t(func))); @@ -40,26 +40,30 @@ namespace utils public: typedef std::list> jobs_container; - template - static void add_job_to_container(jobs_container& cntr, t_executor_func func) + template + static void add_job_to_container(jobs_container& cntr, t_executor_func func) { cntr.push_back(std::shared_ptr(static_cast(new call_executor_t(func)))); } void init() { - m_is_stop = false; int num_threads = std::thread::hardware_concurrency(); - + this->init(num_threads); + } + void init(unsigned int num_threads) + { + m_is_stop = false; + for (int i = 0; i < num_threads; i++) { - m_threads.push_back(std::thread([this](){this->worker_func(); })); + m_threads.push_back(std::thread([this]() {this->worker_func(); })); } } - threads_pool(): m_is_stop(false), m_threads_counter(0) + threads_pool() : m_is_stop(false), m_threads_counter(0) {} - + template bool add_job(t_executor_func func) { @@ -109,41 +113,41 @@ namespace utils } } - private: - void worker_func() + private: + void worker_func() + { + LOG_PRINT_L0("Worker thread is started"); + while (true) { - LOG_PRINT_L0("Worker thread is started"); - while (true) + std::shared_ptr job; { - std::shared_ptr job; - { - std::unique_lock lock(m_queue_mutex); + std::unique_lock lock(m_queue_mutex); - m_condition.wait(lock, [this]() - { - return !m_jobs_que.empty() || m_is_stop; - }); - if (m_is_stop) - { - LOG_PRINT_L0("Worker thread is finished"); - return; - } - - job = m_jobs_que.front(); - m_jobs_que.pop_front(); + m_condition.wait(lock, [this]() + { + return !m_jobs_que.empty() || m_is_stop; + }); + if (m_is_stop) + { + LOG_PRINT_L0("Worker thread is finished"); + return; } - job->execute(); + job = m_jobs_que.front(); + m_jobs_que.pop_front(); } + + job->execute(); } + } - jobs_container m_jobs_que; - std::condition_variable m_condition; - std::mutex m_queue_mutex; - std::vector m_threads; - std::atomic m_is_stop; - std::atomic m_threads_counter; + jobs_container m_jobs_que; + std::condition_variable m_condition; + std::mutex m_queue_mutex; + std::vector m_threads; + std::atomic m_is_stop; + std::atomic m_threads_counter; }; } \ No newline at end of file