C++——线程池实例分析

class fixed_thread_pool {
		public:
			explicit fixed_thread_pool(size_t thread_count)
				: data_(std::make_shared<data>()) {
				for (size_t i = 0; i < thread_count; ++i) {
					std::thread([data = data_] {
						std::unique_lock<std::mutex> lk(data->mtx_);
						for (;;) {
							if (!data->tasks_.empty()) {
								auto current = std::move(data->tasks_.front());
								data->tasks_.pop();
								lk.unlock();  //这里该线程已经拿到了任务,所以解锁,可以让其它的线程来获取任务
								current();
								lk.lock(); //执行到这里了说明这个线程是空闲的,可以继续接受其他任务,所以它要去抢到锁用于执行其他的任务
							}
							else if (data->is_shutdown_) {
								break;
							}
							else {
								data->cond_.wait(lk);
							}
						}
					}).detach();
				}
			}

			fixed_thread_pool() = default;
			fixed_thread_pool(fixed_thread_pool&&) = default;

			~fixed_thread_pool() {
				if ((bool)data_) {
					{
						std::lock_guard<std::mutex> lk(data_->mtx_);
						data_->is_shutdown_ = true;
					}
					data_->cond_.notify_all();
				}
			}

			template <class F>
			void execute(F&& task) {
				{
					std::lock_guard<std::mutex> lk(data_->mtx_);
					data_->tasks_.emplace(std::forward<F>(task));
				}
				data_->cond_.notify_one();
			}

		private:
			struct data {
				std::mutex mtx_; // 类内共享互斥量,以便线程间临界区加锁
				std::condition_variable cond_; // 条件唤醒
				bool is_shutdown_ = false; // 用于关闭线程池
				std::queue<std::function<void()>> tasks_; //用于存放要执行的函数
			};
			std::shared_ptr<data> data_; // 共享智能指针,用于多个线程同时操作data变量

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值