<Linux> 实现简易线程池

文章目录

ThreadPool.hpp

c 复制代码
#pragma once
#include <vector>
#include <queue>
#include <iostream>

#include "Thread.hpp"
#include "LockGuard.hpp"

#define g_threadPool_num 5
template <class T>
class ThreadPool
{
public:
    bool isEmpty()
    {
        return _task_queue.empty();
    }

    void waitCond()
    {
        pthread_cond_wait(&_cond, &_mtx);
    }

    T getTask()
    {
        T t = _task_queue.front();
        _task_queue.pop();

        return t;
    }

public:
    ThreadPool(int threadNum = g_threadPool_num)
        : _threads(threadNum)
    {
        pthread_cond_init(&_cond, nullptr);
        pthread_mutex_init(&_mtx, nullptr);
        for (size_t i = 0; i < threadNum; i++)
        {
            _threads[i] = new Thread(routine, this, i + 1);
        }
    }

    static void *routine(void *args)
    {
        ThreadData *td = (ThreadData *)args;
        ThreadPool<T> *tp = (ThreadPool<T> *)td->_args;
        while (true)
        {
            T task(-1);
            {
                LockGuard lock(&tp->_mtx);
                while (tp->isEmpty())
                {
                    tp->waitCond();
                }
                task = tp->getTask();
            }
            // 仿函数
            task(td->_name);
        }

        return nullptr;
    }

    void pushTask(const T &task)
    {
        LockGuard lock(&_mtx);
        _task_queue.push(task);
        pthread_cond_signal(&_cond);
    }

    void run()
    {
        for (auto &e : _threads)
        {
            e->start();
        }
    }

    ~ThreadPool()
    {

        for (auto &e : _threads)
        {
            e->join();
        }
        pthread_cond_destroy(&_cond);
        pthread_mutex_destroy(&_mtx);
    }

private:
    std::vector<Thread *> _threads;
    std::queue<T> _task_queue;
    pthread_mutex_t _mtx;
    pthread_cond_t _cond;
};

Thread.hpp

c 复制代码
#pragma once
#include <string>
#include <pthread.h>
#include <iostream>
typedef void *(*fun_t)(void *);

class ThreadData
{
public:
    void *_args;
    std::string _name;
    pthread_t _tid;
    fun_t _fun;
};
class Thread
{
public:
    Thread(fun_t callback, void *args, int num)
    {
        char nameBuffer[64] = "Thread --- ";
        sprintf(nameBuffer, "%s%d", nameBuffer, num);
        _td._name = nameBuffer;
        _td._args = args;
        _td._fun = callback;
    }

    void start()
    {
        pthread_create(&_td._tid, nullptr, _td._fun, &_td);
    }

    void join()
    {
        pthread_join(_td._tid, nullptr);
    }

public:
    ThreadData _td;
};

LockGuard.hpp

c 复制代码
#pragma once

#include <pthread.h>

class Mutex
{
public:
    Mutex(pthread_mutex_t *mtx)
        : _pmtx(mtx)
    {
        pthread_mutex_init(_pmtx, nullptr);
    }

    void lock()
    {
        pthread_mutex_lock(_pmtx);
    }

    void unlock()
    {
        pthread_mutex_unlock(_pmtx);
    }

    ~Mutex()
    {

        pthread_mutex_destroy(_pmtx);
    }

private:
    pthread_mutex_t *_pmtx;
};

class LockGuard
{
public:
    LockGuard(pthread_mutex_t *mtx)
        : _mtx(mtx)
    {
        _mtx.lock();
    }

    ~LockGuard()
    {
        _mtx.unlock();
    }

private:
    Mutex _mtx;
};

Task.hpp

c 复制代码
#pragma once
#include <iostream>
class Task
{

public:
    Task(int num)
        : _num(num)
    {
    }

    void operator()(const std::string &name)
    {
        std::cout << name << " 执行" << _num << "任务" << std::endl;
    }

private:
    int _num;
};

test.cc

c 复制代码
#include "ThreadPool.hpp"
#include "Task.hpp"
#include <unistd.h>
int main()
{
    ThreadPool<Task> tp;
    tp.run();

    int index = 0;
    while (true)
    {
        Task t(index++);
        tp.pushTask(t);
        sleep(1);
    }

    return 0;
}
相关推荐
APItesterCris1 小时前
构建弹性数据管道:利用淘宝商品 API 进行流式数据采集与处理
linux·数据库·windows
九河云1 小时前
TOS + 数字孪生:集装箱码头的智能进化密码
大数据·服务器·网络·数据库·数字化转型
艾莉丝努力练剑1 小时前
【C++STL :stack && queue (一) 】STL:stack与queue全解析|深入使用(附高频算法题详解)
linux·开发语言·数据结构·c++·算法
代码or搬砖1 小时前
文件上传阿里云OSS以及本地图片服务器搭建
服务器·阿里云·云计算
悟能不能悟1 小时前
dcpatchscan.exe这是什么
运维·服务器
kyle~1 小时前
计算机系统---CPU的进程与线程处理
linux·服务器·c语言·c++·操作系统·计算机系统
wanhengidc1 小时前
云手机 流畅运行
运维·服务器·安全·游戏·智能手机
NiKo_W1 小时前
Linux 进程通信——基于责任链模式的消息队列
linux·服务器·消息队列·责任链模式·进程通信
云飞云共享云桌面2 小时前
广东某模具制造工厂用一台云服务器供8个研发设计同时用
linux·运维·服务器·网络·自动化·制造
大博士.J2 小时前
手机端-adb脚本自动化-真机版
运维·智能手机·自动化