C++ --- 基于std::thread实现的线程池

2021-07-27 22:56

阅读:634

标签:tor   bsp   大小   package   uniq   join   ++   error   res    #ifndef THREAD_POOL_H #define THREAD_POOL_H #include #include #include #include #include #include #include #include #include class ThreadPool { public: ThreadPool(size_t); template auto enqueue(F&& f, Args&&... args) -> std::future; ~ThreadPool(); // int GetFreeThreadNum(){return freeThreadNum;} int num;//向线程池push的任务总数,没有加锁 private: // need to keep track of threads so we can join them std::vector workers; // the task queue std::queue tasks; // synchronization std::mutex queue_mutex; std::condition_variable condition; bool stop; // std::atomic freeThreadNum;//线程池空闲线程数量 }; // the constructor just launches some amount of workers inline ThreadPool::ThreadPool(size_t threads) : stop(false) ,num(0) { // freeThreadNum = threads; for(size_t i = 0;iqueue_mutex); this->condition.wait(lock, [this]{ return this->stop || !this->tasks.empty(); });//没有要执行任务的时候,线程沉睡(不会浪费资源) if(this->stop && this->tasks.empty()) return; task = std::move(this->tasks.front()); this->tasks.pop(); } // freeThreadNum--; task(); // freeThreadNum++; } } ); } // add new work item to the pool template auto ThreadPool::enqueue(F&& f, Args&&... args) -> std::future { using return_type = typename std::result_of::type; auto task = std::make_shared( std::bind(std::forward(f), std::forward(args)...) ); std::future res = task->get_future(); { std::unique_lock lock(queue_mutex); // don‘t allow enqueueing after stopping the pool if(stop) throw std::runtime_error("enqueue on stopped ThreadPool"); tasks.emplace([task](){ (*task)(); }); } condition.notify_one(); // num++; return res; } // the destructor joins all threads inline ThreadPool::~ThreadPool() { { std::unique_lock lock(queue_mutex); stop = true; } condition.notify_all(); for(std::thread &worker: workers) worker.join(); } #endif 说明: ThreadPool(size_t threadsNum); 构造函数,通过threadsNum指定线程池的大小。auto enqueue(F&& f, Args&&... args); 需要放到线程池中运行的函数,和参数。~ThreadPool(); 析构函数,在线程池对象销毁的时候,如果线程池中还有未执行的任务,会依次唤醒,并执行完成,最后结束线程池中所有线程。C++ --- 基于std::thread实现的线程池标签:tor   bsp   大小   package   uniq   join   ++   error   res   原文地址:https://www.cnblogs.com/linxisuo/p/14966996.html


评论


亲,登录后才可以留言!