C++11线程池的实现

线程池是指定线程创建的个数,每个线程只是创建销毁一次。比起毫无限制的创建线程销毁线程效率更高。毕竟频繁的创建销毁线程会消耗系统资源,而且系统创建线程也是有上限的。

基于上一篇的线程安全队列实现

class thread_pool
{
private:
	atomic_bool 							done;		//原子操作
	vector<thread> 							work_thread;//工作线程
	thread_safe_queue<function<void()>> 	work_queue;	//工作队列

public:

	thread_pool(int n);
	void submit(function<void()> f);
	~thread_pool();
};


thread_pool::thread_pool(int n):done(false)
{
	for(int i=0;i<n;i++)
	{
		work_thread.emplace_back([this](){
			for(;;)
			{
				function<void()> task;
				bool bl=this->work_queue.wait_and_pop(task,this->done);

				if(bl)
				{	
					//执行任务
					task();
				}
				else
				{
					//进程结束条件
					return ;
				}
			}
		});
	}
}

//1  notify_all非常重要,每个任务都notify_one,最终condition_variable.wait会被阻塞。使用notify_all
//   所有的进程都会出发一次wait,故而跳出阻塞,结束线程
thread_pool::~thread_pool()
{
	done=true;

	work_queue.notify_all();//1
	
	for(auto &worker:work_thread)
	{
		worker.join();
	}
}
void thread_pool::submit(function<void()> f)
{
	work_queue.push(f);
}


使用

int main()
{
	thread_pool tp(20);
	for(int i=0;i<20;i++)
	{
		tp.submit([i](){
			this_thread::sleep_for(std::chrono::seconds(1));
			cout<<i;
		});
	}
}

condition_variable:

是c++11多线程编程中提供的一种同步的机制。成员函数notify_one会通知一个等待线程,而成员函数notify_all会通知所有的等待线程。成员函数wait需要传递两个参数,一个锁一个函数指针。wait()会去检查函数的返回值。如果条件不满足(函数返回false),wait()函数会解锁互斥量,而且将这个线程置于阻塞或等待状态。当准备数据的线程调用notify_one()通知条件变量时,处理数据的线程从睡眠状态中苏醒,重新获得互斥锁,并且对条件再次判断,如果条件满足,从wait()返回并继续持有锁。如果条件不满足时,线程将对传入进来的互斥量解锁,并且重新开始等待。





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值