• Linux-线程池



    前言

    线程池主要是对之前内容的一个巩固,并且初步了解池化概念。


    一、线程池是什么?

    线程池就是提前开辟好一块空间,随时准备创造新线程来完成任务,可以理解为用空间来换时间,具体实现看以下示例代码

    二、示例代码

    #include 
    #include 
    #include 
    #include "lockGuard.hpp"
    #include "log.hpp"
    const int default_ThreadNum = 5;
    template <class T>
    class ThreadPool
    {
    
    public:
        ThreadPool(int thread_num = default_ThreadNum)
        :_thread_num(thread_num)
        {
            pthread_mutex_init(&_mutex,nullptr);
            pthread_cond_init(&_cond,nullptr);
            for (int i = 1; i <= _thread_num; i++)
            {
                char nameBuffer[128];
                snprintf(nameBuffer, sizeof nameBuffer, "Thread %d", i);
                _threadPool.push_back(new Thread(nameBuffer, routine, (void *)this));
                logMessage(NORMAL, "%s 线程创建成功!", nameBuffer);
            }
        }
    
        bool isEmpty()
        {
            return _task_queue.empty();
        }
    
        void waitCond()
        {
            pthread_cond_wait(&_cond, &_mutex);
        }
    
        pthread_mutex_t &getMutex()
        {
            return _mutex;
        }
    
    
        T getTask()
        {
            T task = _task_queue.front();
            _task_queue.pop();
            return task;
        }
    
        std::vector<Thread> &getpool()
        {
            return _threadPool;
        }
    
        static void *routine(void *args)
        {
            ThreadData *td = (ThreadData *)args;
            ThreadPool<T> *tp = (ThreadPool<T> *)td->_args;
            while (1)
            {
                T task;
                {
                    lockGuard lg(&tp->getMutex());
                    while (tp->isEmpty())
                        tp->waitCond();
                    task = tp->getTask();
                }
                task(td->_name);
            }
        }
    
        void run()
        {
            for(auto& thread : _threadPool)
            {
                thread->start();
            }
        }
    
         void pushTask(const T &task)
         {
            lockGuard lg(&_mutex);
            _task_queue.push(task);
            pthread_cond_signal(&_cond);
         }
    
        ~ThreadPool()
        {
            for(auto& iter: _threadPool)
            {
                iter->join();
                delete iter;
            }
            pthread_mutex_destroy(&_mutex);
            pthread_cond_destroy(&_cond);
        }
    
    private:
        int _thread_num;
        std::vector<Thread*> _threadPool;
        std::queue<T> _task_queue;
    
        pthread_mutex_t _mutex;
        pthread_cond_t _cond;
    };
    

  • 相关阅读:
    JAVA String API即StringBuilderAPI
    「滑动窗口算法概述」
    Jetson xvaier nx 安装torch1.6.0 torchvision0.7.0
    这些「误区」99%的研发都踩过
    Arduino开发实例-SR04T/SR04M 防水超声波传感器驱动
    mysql之主备延迟
    计组 | 交叉编址 & 流水线
    搭建yum源并定时同步
    12 个强大的现代 CSS 技术
    工控机专业知识解析
  • 原文地址:https://blog.csdn.net/fengjunziya/article/details/139034156