Linux---线程池

**线程池是一个线程的使用模式, 当线程创建过多的时候,会带来调度开销, 而当处理短时时间任务比较多的时候, 者中调度开销,可能会影响程序执行的性能, 而线程池维护着多个线程, 它等待着用户向他分配并发可执行任务,当没有任务到来的时候, 线程池中的线程不会退出,而是进行等待, 并且线程池中也包含一个任务队列, 用户只需要将处理的任务放在任务队列中, 而线程会自己去想任务队列中拿去任务进行处理 **

线程池的实现

线程池是由大量线程+任务队列来实现的

任务队列的结点中包含了两个成员变量, 一个是需要处理的任务的数据, 一个是这个任务的处理方式(任务的处理方式就是线程的执行函数), 除此之外还包含了一个Run接口, 该接口的作用就是,将该节点中的数据放入到执行函数中让其执行起来
在这里插入图片描述

typedef void  (*handler_t)(int)
class Queue_Node{
	public:
		Queue_Node(int data,handler_t handler)
			:_data(data)
			,_handler(handler)
		{}
		void Run(){
			return handler(_data);
		}
	private:
		int _data;
		handler_t _handler;
};

为了让我们的线程池保证执行的性能可以最大化的应用, 我们就想最好的情况就是, 当我们的队列中没有任务的时候,所有线程进行等待, 当我们的任务队列中满的时候,我们让用户的入队操作陷入等待, 这是一个典型的消费者与生产者模型, 因此线程池也必须保证线程安全

class ThreadPool{
	public:
		ThreadPool(int maxt=5,int maxq=10)
			:_thr(maxt)
			,_thr_num(maxt)
			,_capacity(maxq)
			,_thr_flag(false)
		{
			pthread_mutex_init(&_mutex);
			pthread_cond_init(&_con_cond);
			pthread_cond_init(&_pro_cond);
		}
		~ThreadPool(){
			pthread_mutex_destroy(&_mutex);
			pthread_cond_destroy(&_con_cond);
			pthread_cond_destroy(&_pro_cond);
		}
		bool PoolInit(){
			_thr_cur=0;
			for(int t=0;i<_thr_num;i++){
				_thr[i]=thread(&ThreadPool::thr_start,this);
				_thr_cur++
				_thr[i].detach();
			}
			return true;
		}
		bool PushThread(Queue_Node node){
			prhead_mutex_lock(&lock);
			while(1){
				pthread_cond_wait(&_pro_cond,&_mutex)
			};
			_queue.push(node);
			pthread_mutex_unlock(&_mutex);
			pthread_cond_signal(&_con_cond);
			return true;
		}
		bool Poolstop(){
            pthread_mutex_lock(&_mutex);
            _thr_flag=true;
            pthread_mutex_unlock(&_mutex);                                                                                                                   
            pthread_cond_broadcast(&_cond_con);
            while(_thr_cur>0){
                pthread_cond_broadcast(&_cond_con);
                usleep(1000);
            }
            return true;
        }
	private:
		 void thr_start(){
           while(1){
               pthread_mutex_lock(&_mutex);
               while(_queue.empty()){
                   if(_thr_flag==true){
                       cout<<pthread_self()<<" ---> 线程退出 "<<endl;
                       pthread_mutex_unlock(&_mutex);
                       _thr_cur--;
                       return;
                   }
                   pthread_cond_wait(&_cond_con,&_mutex);
               }
               MyTask tt=_queue.front();
               _queue.pop();
               pthread_mutex_unlock(&_mutex);
               pthread_cond_signal(&_cond_pro);
               //任务处理应该放在解锁之后,否知同一时间只有一个线程在处理任务
               tt.Run();
           }
           return ;
       }
	private:
		pthread_mutex_t _mutex;
		pthread_cond_t _con_cond;
		prhtead_cond_t _pro_cond;
		queue<Queue_Node> _queue;
		//任务队列的最大数
		int _capacity;
		vector<thread> _thr;
		//线程的最大数量
		int _thr_num;
		bool _thr_flag;
        int _thr_cur;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值