c++线程池

本文介绍了一个使用Linux系统函数实现的C++线程池,通过创建ITask接口并实现run方法,可以方便地将任务添加到线程池进行执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用linux下的系统函数封装了个简单线程池,需要添加新任务时,继承ITask实现自己的run方法,然后add到线程池即可。

main.cpp

#include "threadPool.h"
#include <iostream>
#include <unistd.h>
using namespace std;


class MyTask: public ITask{
public:
    MyTask() = default;
    ~MyTask(){};
    void run(){//实现自己的run方法
        cout<<"id =  "<<m_id<<endl;
        sleep(1);
        return;
    }
};

int main(){
    ThreadPool threadPool(5);
    for(int i = 0; i < 10; i++){
        MyTask *task = new MyTask();
        task->setId(i);
        threadPool.addTask(task);
    }
    cout<<"add task end"<<endl;
    sleep(4);
    threadPool.stopAll();
    return 0;
};

threadpool.cpp

#include "threadPool.h"
#include <iostream>
using namespace std;

void* ThreadFunc(void* data){
    ThreadPool *threadPool = (ThreadPool*)data;
    pthread_t threadId = pthread_self();
    while(1){

        pthread_mutex_lock(&threadPool->m_pthreadMutex);
        if(threadPool->m_shutDown){
            printf("tid: %lu exit\n", pthread_self());
            pthread_mutex_unlock(&threadPool->m_pthreadMutex);
            //pthread_exit(nullptr);
            break;
        }

        while(threadPool->m_TaskList.empty() && !threadPool->m_shutDown){
            pthread_cond_wait(&threadPool->m_pthreadCond, &threadPool->m_pthreadMutex);
        }
        
        if(!threadPool->m_TaskList.empty()){
            ITask* Task = threadPool->m_TaskList.front();
            threadPool->m_TaskList.pop();
            pthread_mutex_unlock(&threadPool->m_pthreadMutex);
            printf("tid: %lu do task\n", threadId);
            if(nullptr != Task){
                Task->run();
                delete Task;
            }    
        }
        else{
            pthread_mutex_unlock(&threadPool->m_pthreadMutex);
        }
        
    }
    return (void*)0;
};

void ThreadPool::createThread(){
    m_ptPthread = new pthread_t[m_threadNum];
    for(int i = 0; i < m_threadNum; i++){
        pthread_create(&m_ptPthread[i], nullptr, ThreadFunc, (void *)this);
    }
    return;
};

void ThreadPool::stopAll(){

    if(m_shutDown) return ;

    cout<<"stop all thread"<<endl;
    m_shutDown = true;
    pthread_cond_broadcast(&m_pthreadCond);
    for(int i = 0; i < m_threadNum; i++){
        pthread_join(m_ptPthread[i], NULL);
    }
    return;
}

void ThreadPool::addTask(ITask* task){
    pthread_mutex_lock(&m_pthreadMutex);
    m_TaskList.push(task);
    pthread_mutex_unlock(&m_pthreadMutex);
    pthread_cond_signal(&m_pthreadCond);
    return;
}


threadPool.h

#ifndef _THREAD_POOL_H
#define _THREAD_POOL_H
#include<queue>
#include<string>
#include<pthread.h>
using namespace std;

class ITask{
public:
    ITask(){};
    ITask(string& strTaskName): m_strTaskName(strTaskName), m_id(0){};
    virtual ~ITask(){};
    void setId(int id){
        m_id = id;
	};
    virtual void run() = 0;
protected:
    string m_strTaskName;
    int m_id;
};


class ThreadPool{
public:
    ThreadPool(int ithreadNum): m_threadNum(ithreadNum){
        m_shutDown = false;
        m_pthreadMutex = PTHREAD_MUTEX_INITIALIZER;
        m_pthreadCond = PTHREAD_COND_INITIALIZER;
        createThread();
    };
    ~ThreadPool(){
        if(nullptr != m_ptPthread)
            delete[] m_ptPthread;
        m_ptPthread = nullptr;
        pthread_mutex_destroy(&m_pthreadMutex);
        pthread_cond_destroy(&m_pthreadCond);
        while(!m_TaskList.empty()){
            ITask *taskTmp = m_TaskList.front();
            m_TaskList.pop();
            delete taskTmp;
        }
    };
    void addTask(ITask* task);
    void stopAll();

private:
    int m_threadNum;
    bool m_shutDown;
    queue<ITask*> m_TaskList;
    pthread_t* m_ptPthread;
    pthread_mutex_t m_pthreadMutex;
    pthread_cond_t m_pthreadCond;
protected:
    void createThread();
    friend void* ThreadFunc(void* threadData);
};
#endif

cc = g++
prom = calc
deps = $(shell find ./ -name "*.h")
src = $(shell find ./ -name "*.cpp")
obj = $(src:%.c=%.o)

$(prom): $(obj)
	$(cc)  -std=c++11 -o  $(prom) $(obj)  -lpthread

%.o: %.c $(deps)
	$(cc) -c $< -o $@

clean:
	rm -rf $(obj) $(prom)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值