1. 程式人生 > 其它 >c++ 實現的簡易執行緒池

c++ 實現的簡易執行緒池

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_;
};