C++手写线程池(linux下)

线程池相关

手写线程池:

先写一个线程同步机制封装类locker.h

#ifndef LOCKER_H
#define LOCKER_H

#include<pthread.h>
#include<exception>
#include<semaphore.h>
//互斥锁类
class locker{
	private:
    	pthread_mutex_t m_mutex;
    public:
    	locker(){
            //创建互斥锁
            if(pthread_mutex_init(&m_mutex,NULL)){
                throw std::exception();
            }
        }
    	~locker(){
        	//销毁互斥锁
         (pthread_mutex_destroy(&m_mutex);          
		}
         bool lock(){
             return pthread_mutex_lock(&m_mutex)==0;
         }
         bool unlock(){
             return pthread_mutex_unlock(&m_mutex)==0;
         }
         pthread_mutex_t *get(){
             return &m_mutex;
         }
};

//条件变量类
class cond{
    private:
    	pthread_cond_t m_cond;
    public:
    	cond(){
            if(pthread_cond_init(&m_cond,NULL))
                throw std::exception();
        }
    	~cond{
            pthread_cond_destroy(&m_cond);
        }
    	bool wait(pthread_mutex_t *mutex){
            return pthread_cond_wait(&m_cond,mutex)==0;
        }
    	bool timedwait(pthread_mutex_t *mutex,struct timespec t){
            return pthread_cond_timedwait(&m_cond,mutex,&t)==0;
        }
    	bool signal(){
            return pthread_cond_signal(&m_cond)==0;
        }
    	bool broadcast(){
            return pthread_cond_broadcast(&m_cond)==0;
        }
};          

//信号量类
class sem{
    private:
        sem_t m_sem;
    public:
    sem(){
        if(sem_init(&m_sem,0,0)){
            throw std::exception();
        }
    }
    sem(int num){
        if(sem_init(&m_sem,0,num)){
            throw std::exception();
        }
    }
    ~sem(){
        sem_destroy(&m_sem);
    }
    //等待信号量
    bool wait(){
        return sem_wait(&m_sem)==0;
    }
    //增加信号量
    bool post(){
        return sem_post();
    }
};        
#endif

然后写线程池类

#ifndef THREADPOOL_H
#define THREADPOOL_H

#include<list>
#include"locker.h"
#include<pthread.h>
//定义模板类为了代码复用
template<typename T>
class threadpool{
  private:
    //线程数量
    int m_thread_number;
    //线程池数组,大小m_thread_number
    pthread_t *m_threads;
    //请求队列中最多等待数量
    int m_max_requests;
    //请求队列
    std::list<T*> workqueue;
    //互斥锁
    locker m_queuelocker;
    //信号量判断是否有任务需要处理
    sem m_queuestat;
    //是否结束线程
    bool m_stop;
  private:
    static void * worker(void *arg);
    void run();
  public:
    threadpool(int thread_number=8,int max_requests=10000);
    ~threadpool();
    bool append(T*request);
};

template<typename T>
threadpool<T>::threadpool(int thread_number=8,int max_request=10000):m_thread_number(thread_number),m_max_requests(max_requests)
,m_stop(flase),m_threads(NULL){
    if(thread_number<=0||max_request<=0){
        throw std::exception();
    }
    mthreads = new pthread_t[m_thread_number];
    if(!mthread){
        throw std::exception();
    }
    
    for(int i=0;i<thread_number;++i){
        cout<<"正在创建第"<<i<<"个线程"<<endl;
        if(pthread_create(m_threads+i,NULL,worker,this));//worker必须是静态函数
        {
            delete [] m_threads;
            throw std::exception();
        }
        if(pthread_detach(m_threads[i])){
            delete [] m_threads;
            throw std::exception();
        }
    }
}
template<typename T>
~threadpool<T>::threadpool(){
    delete []m_threads;
    m_stop=true;
}

template<typename T>
bool threadpool<T>::append(T *request){
    m_queuelocker.lock();
    if(m_workqueue.size()>m_max_request){
        m_queuelocker.unlock();
        return false;
    }
    m_workqueue.push_back(request);
    m_queuelock.unlock();
    m_queuestat.post();
    return true;
}
template<typename T>
void *threadpool<T>::worker(void *arg){
    threadpool *pool = (threadpool *)arg;
    pool->run();
    return pool;
}
template<typename T>
void threadpool<T>::run(){
    while(!m_stop){
        m_queuestat.wait();//没有值就阻塞,有值就不阻塞,判断是否有任务需要处理
        m_queuelocker.lock();
        if(m_workqueue.empty()){
           m_queuelocker.unlock(); 
            continue;
        }
        T *request=m_workqueue.front();
        m_workqueue.pop_front();
        m_queuelocker.unlock();
        if(!request){
            continue;
        }
        request->process();//这是你自定义的请求中的任务
        
    }
}
#endif
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值