c++ 實現的簡易執行緒池
阿新 • • 發佈:2022-05-22
template<typename T> class BlockingQueue { public: BlockingQueue() = default; BlockingQueue(const BlockingQueue&) = delete; BlockingQueue& operator=(const BlockingQueue&) = delete; void push(const T& val) { lock_guard<mutex> lock(mutex_); data_.push(val); cond_.notify_one(); } T pop() { unique_lock<mutex> lock(mutex_); while (data_.empty()) { cond_.wait(lock); } T tmp = data_.front(); data_.pop(); return tmp; } private: queue<T> data_; mutex mutex_; condition_variable cond_; }; class TharedPool { public: using Functor = function<void()>; TharedPool(): running_(true), taskQueue(){ //num_of_computing_thread 是全域性常量,一般與核心執行緒數相同 for (int i = 0; i < num_of_computing_thread; ++i) { threads_.push_back(thread(&workerThread,this)); } } void post(Functor functor) { taskQueue.push(functor); } private: static void workerThread(TharedPool* tp) { while (tp->running_) { Functor task = tp->taskQueue.pop(); task(); } } BlockingQueue<Functor> taskQueue; vector<thread> threads_; bool running_; };