Linux-线程池

慈云数据 2024-05-30 技术支持 23 0

文章目录

  • 前言
  • 一、线程池是什么?
  • 二、示例代码

    前言

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

    Linux-线程池
    (图片来源网络,侵删)

    一、线程池是什么?

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

    二、示例代码

    #include 
    #include 
    #include 
    #include "lockGuard.hpp"
    #include "log.hpp"
    const int default_ThreadNum = 5;
    template 
    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 
                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
            return _threadPool;
        }
        static void *routine(void *args)
        {
            ThreadData *td = (ThreadData *)args;
            ThreadPool_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 _threadPool;
        std::queue _task_queue;
        pthread_mutex_t _mutex;
        pthread_cond_t _cond;
    };
    

    Linux-线程池
    (图片来源网络,侵删)
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon