zoukankan      html  css  js  c++  java
  • C/C++ 智能指针线程池

    //这个线程池存在一定的BUG 如果没有多线程编程基础的先生请谨慎使用

    //我放弃了这种模板方式的线程池,最好不要使用!!!!!!!

    ThreadPool.h

    {

    #ifndef __THREADPOOL_H__
    #define __THREADPOOL_H__
    #include <memory>
    #include <mutex>
    #include <iostream>
    #include <thread>
    #include <vector>
    
    typedef unsigned int THREADHANDLE;
    static THREADHANDLE ThreadHanle = -1;
    #define THREADBEGIN(var) if(var == ThreadHanle){return;}
    
    /*
    #include "ThreadPool.h"
    mutex m;
    
    void func(int threadID)
    {
        while (true)
        {
            THREADBEGIN(threadID);
            std::lock_guard<mutex> lg(m);
            static int time = GetTickCount();
            static int index = 0;
            if (GetTickCount() - time >= 1000)
            {
                std::cout << index <<" threadNum: "<< threadID << std::endl;
                time = GetTickCount();
                index++;
            }
        }
    }
    
    
    int Main()
    {
    
        system("color 2");
    
        ThreadPool<shared_ptr<thread>> T;
        int count = 5;
        for (int i = 0; i < count; i++)
        {
            shared_ptr<thread> ptrT(new thread(func, i));
    
            T.addChild(std::move(ptrT));
        }
    
        std::cout << "线程初始完毕!" << std::endl;
    
        T.stop();
    
        system("pause");
        return 0;
    }
    */
    
    using namespace std;
    template<typename PTRTHREAD>
    class ThreadPool:public thread
    {
        vector<shared_ptr<thread>> *m_vThread = nullptr;
    public:
        ThreadPool();
        ThreadPool(PTRTHREAD Thread);
        ~ThreadPool();
    
        //返回当前这个线程的位置,不是ID
        int addChild(PTRTHREAD Thread);
        //停止一个线程
        void stop(THREADHANDLE ThreadID);
        //停止所有线程
        void stop();
    private:
        //void start();
    };
    
    
    
    template<typename PTRTHREAD>
    inline ThreadPool<PTRTHREAD>::ThreadPool()
    {
        m_vThread = new vector<shared_ptr<thread>>();
    }
    
    //没有join()
    template<typename PTRTHREAD>
    inline ThreadPool<PTRTHREAD>::ThreadPool(PTRTHREAD Template)
    {
        m_vThread = new vector<shared_ptr<thread>>();
        m_vThread->push_back(Template);
        /*
        下面他妈两种方法都可以
        由于继承了thread 所以可以访问get()这个受保护的函数
        */
        //m_vThread[0].begin()->get()->join();
        //m_vThread->begin()->get()->join();
    }
    
    template<typename PTRTHREAD>
    inline ThreadPool<PTRTHREAD>::~ThreadPool()
    {
        if (m_vThread != nullptr)
        {
            for (vector<shared_ptr<thread>>::iterator i = this->m_vThread->begin(); i != this->m_vThread->end(); i++)
            {
                //如果智能指针不为empty
                if ((*i))
                {
                    bool ret = i->get()->joinable();
                    //如果可以join()
                    if (ret)
                    {
                        i->get()->join();
                    }
                    i->reset();
                }
            }
            m_vThread->clear();
            delete m_vThread;
            m_vThread = nullptr;
        }
    }
    
    template<typename PTRTHREAD>
    int ThreadPool<PTRTHREAD>::addChild(PTRTHREAD ptrThread)
    {
        this->m_vThread->push_back(ptrThread);
        int ret = this->m_vThread->size() - 1;
        return ret;
    }
    
    template<typename PTRTHREAD>
    void ThreadPool<PTRTHREAD>::stop(THREADHANDLE ThreadID)
    {
        if (!this->m_vThread->empty())
        {
            int i = 0;
            for (vector<shared_ptr<thread>>::iterator it = this->m_vThread->begin(); it != this->m_vThread->end(); it++,i++)
            {
                if (i == ThreadID)
                {
                    if ((*it))
                    {
                        ThreadHanle = ThreadID;
                        bool ret = it->get()->joinable();
                        if (ret)
                        {
                            it->get()->join();
                            printf("成功结束线程 <ID = %d> ......
    ",ThreadID);
                        }
                        it->reset();
                        it = this->m_vThread->erase(it);
                        //直接return 就不用else
                        return;
                    }
                }
                //else
                //{
                //    it++;
                //    i++;
                //}
            }
        }
    }
    
    template<typename PTRTHREAD>
    void ThreadPool<PTRTHREAD>::stop()
    {
        if (!this->m_vThread->empty())
        {
            int i = 0;
            for (vector<shared_ptr<thread>>::iterator it = this->m_vThread->begin(); it != this->m_vThread->end(); )
            {
                if ((*it))
                {
                    ThreadHanle = i;
                    bool ret = it->get()->joinable();
                    if (ret)
                    {
                        it->get()->join();
                        printf("成功结束线程 <ID = %d> ......
    ", ThreadHanle);
                        it->reset();
                        it = this->m_vThread->erase(it);
                        i++;
                    }
                    else
                    {
                        it++, i++;
                    }
                }
            }
        }
    }
    
    
    #endif // !__THREADPOOL_H__

    }

  • 相关阅读:
    SpringBoot自动配置原理(七)
    SpringBoot 集成Shiro
    Shiro配置跳过权限验证
    rsync+ssh同步备份文件
    okhttp3设置代理(http/https)
    Spring RestTemplete支持Https安全请求
    电商课题V:分布式锁
    电商课题:对付秒杀器等恶意访问行为的简单梳理
    电商课题:客户端的IP地址伪造、CDN、反向代理、获取的那些事儿
    电商课题I:集群环境下业务限流
  • 原文地址:https://www.cnblogs.com/YZFHKMS-X/p/11896317.html
Copyright © 2011-2022 走看看