ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c++ 实现的简易线程池

2022-05-22 12:04:09  阅读:247  来源: 互联网

标签:Singleton const _. lock c++ 简易 线程 threads BlockingQueue


//单例类
template<typename T>
class Singleton {
public:
	static T &instance() {
		call_once(onceFlag_, [&]{instance_ = new T(); });
		return *instance_;
	}
private:
	Singleton()=default;
	Singleton(const Singleton&) = delete;
	Singleton &operator=(const Singleton&) = delete;
	~Singleton() = default;
	static once_flag onceFlag_;
	static atomic<T *> instance_;
};

template<typename T> 
atomic<T *> Singleton<T>::instance_ = nullptr;
template<typename T>
once_flag Singleton<T>::onceFlag_;

//阻塞队列
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);
	}
	//强制停止,不保证任务队列执行完毕。因为理论上线程池应该做成单例模式,与进程的生命周期相同,其实不用怎么考虑销毁,这边是特意先讨论下如何销毁才写上的
	void stop() {
		running_ = false;
                //发送空任务,进行“唤醒”
		for (int i = 0; i < threads_.size(); ++i) {
			post([] {});
		}
		for (int i = 0; i < threads_.size(); ++i) {
			threads_[i].join();
		}
	}

private:
	static void workerThread(TharedPool* tp) {
		while (tp->running_) {
			Functor task = tp->taskQueue_.pop();
			task();
		}
	}

	BlockingQueue<Functor> taskQueue_;
	vector<thread> threads_;
	bool running_;
};
//配合上面的单例模式使用,或者写个单例模式类进行包装

标签:Singleton,const,_.,lock,c++,简易,线程,threads,BlockingQueue
来源: https://www.cnblogs.com/komet/p/16297507.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有