线程池 TreadPool

线程池 TreadPool

项目描述: 使用多线程技术,实现了 treadpool 管理多个线程并提供任务队列的接口。在线程池初始化后,将等候在条件变量上的一个线程唤醒并从该任务队列中取出第一个任务给该线程执行,等待任务队列中所有任务执行完成。treadpool 提高了响应的速度和多线程的可管理性,降低了资源的消耗。

代码如下:

#include 
#include 
#include 
#include 
using namespace std;

typedef void (*task_func_t)(void*);
typedef void* task_arg_t;
// 任务类
class Task{
    task_func_t pfunc;  // 任务函数
    task_arg_t parg;    // 任务参数
public:
    Task(task_func_t func,task_arg_t arg):pfunc(func),parg(arg){}
    void Execute()const{
        pfunc(parg);
    }
};

// 线程池
class ThreadPool{
    queue<Task> tasks;   //任务队列
    pthread_t tids[6];   // 线程集合
    pthread_mutex_t mutex;   // 创建互斥锁
    pthread_cond_t cond;    // 创建条件变量
    bool shutdown;
    // 添加新任务,把一个线程叫醒
    // 线程池退出时,叫醒所有线程退出
public:
    ThreadPool():shutdown(false){
        pthread_mutex_init(&mutex,NULL);
        pthread_cond_init(&cond,NULL);
        for(auto& tid:tids){
            pthread_create(&tid,NULL,(void*(*)(void*))&ThreadPool::routine,this);
        }
    }
    ThreadPool(const ThreadPool&) = delete;
    ThreadPool& operator=(const ThreadPool&) = delete;
    ~ThreadPool(){
        shutdown = true;
        pthread_cond_broadcast(&cond);   // 唤醒所有线程
        for(auto tid:tids){
            pthread_join(tid,NULL);
        }
        pthread_mutex_destroy(&mutex);
        pthread_cond_destroy(&cond);
    }
    void AddTask(task_func_t func,task_arg_t arg){
        pthread_mutex_lock(&mutex);
        tasks.push(Task(func,arg));
        pthread_mutex_unlock(&mutex);
        pthread_cond_signal(&cond);  // 唤醒一个线程
    }
    static void* routine(void* arg){   // 线程执行任务函数
        ThreadPool* pool = (ThreadPool*)arg;
        for(;;){
            // 资源回收,在执行pthread_exit函数后会调用此函数,释放互斥锁
            pthread_cleanup_push((void(*)(void*))pthread_mutex_unlock,&pool->mutex);
            pthread_mutex_lock(&pool->mutex);
            while(!pool->shutdown && pool->tasks.empty()){
                pthread_cond_wait(&pool->cond,&pool->mutex);
            }
            if(pool->shutdown && pool->tasks.empty()){
                //pthread_mutex_unlock(&pool->mutex);
                pthread_exit(NULL);   // 线程退出
            }
            Task task = pool->tasks.front();
            pool->tasks.pop();
            pthread_mutex_unlock(&pool->mutex);
            task.Execute();
            pthread_cleanup_pop(0);  //调用pthread_exit()后线程退出自动释放资源
            
        }
    }

};

void test(void* arg){
    cout << pthread_self() << ":" << (char*)arg << endl;
    sleep(1);   //  模拟占用时间的操作
}
int main(){
    Task t(test,(task_arg_t)"Hello World");
    t.Execute();

    ThreadPool pool;
    pool.AddTask(test,(task_arg_t)"Hello1");
    pool.AddTask(test,(task_arg_t)"Hello2");
    pool.AddTask(test,(task_arg_t)"Hello3");
    pool.AddTask(test,(task_arg_t)"Hello4");
    pool.AddTask(test,(task_arg_t)"Hello5");
    pool.AddTask(test,(task_arg_t)"Hello6");
    pool.AddTask(test,(task_arg_t)"Hello7");
    pool.AddTask(test,(task_arg_t)"Hello8");
    pool.AddTask(test,(task_arg_t)"Hello9");
    pool.AddTask(test,(task_arg_t)"Hello10");
}

你可能感兴趣的:(项目)