• c++11 线程池


    也可参考:  https://www.cnblogs.com/ailumiyana/p/10016965.html  ***
    https://blog.csdn.net/jlusuoya/article/details/74505558  ***
     https://www.cnblogs.com/magicsoar/p/3788180.html  *****
     
    //nocopyable类,不可拷贝基类继承它,派生类不可拷贝
    //nocopyable.h
    #ifndef NOCOPYABLE_H
    #define NOCOPYABLE_H
     
    namespace fivestar
    {
      class nocopyable
      {
      private:
          nocopyable(const nocopyable& x) = delete;
          nocopyable& operator=(const nocopyable&x) = delete;
      public:
          nocopyable() = default;
          ~nocopyable() = default;
      };
     
    }
     
    #endif // NOCOPYABLE_H
     
    //ThreadPool.h
    #ifndef THREADPOOL_H
    #define THREADPOOL_H
     
    #include <thread>
    #include <mutex>
    #include <functional>
    #include <string>
    #include <condition_variable>
    #include <deque>
    #include <vector>
    #include <memory>
     
    #include "nocopyable.h"
    namespace fivestar
    {
      class ThreadPool:public nocopyable
      {
      public:
          typedef std::function<void()> Task;
     
          explicit ThreadPool(const std::string &name = std::string());
          ~ThreadPool();
     
     
          void start(int numThreads);//设置线程数,创建numThreads个线程
          void stop();//线程池结束
          void run(const Task& f);//任务f在线程池中运行
          void setMaxQueueSize(int maxSize) { _maxQueueSize = maxSize; }//设置任务队列可存放最大任务数
     
    private:
          bool isFull();//任务队列是否已满
          void runInThread();//线程池中每个thread执行的function
          Task take();//从任务队列中取出一个任务
     
          std::mutex _mutex;
          std::condition_variable _notEmpty;
          std::condition_variable _notFull;
          std::string _name;
          std::vector<std::thread> _threads;
          std::deque<Task> _queue;
          size_t _maxQueueSize;
          bool _running;
      };
    }
     
    #endif // THREADPOOL_H
     
     

    注意:

    1 .为线程池添加任务之前一定要调用setMaxQueueSize,设置任务队列可存放的最大任务数,否则线程池退化为单线程

    2 若不调用start创建线程,则线程池退化为单线程

    测试代码

    #include <iostream>
    #include "ThreadPool.h"
     
    using namespace std;
     
    void Test(int i)
    {
        printf("I love you %d time ",i);
    }
     
    int main()
    {
        fivestar::ThreadPool threadPool;
        threadPool.setMaxQueueSize(10);
        threadPool.start(2);
     
        for(int i = 0;i < 10;++i)
        {
            auto task = bind(Test,i);
            threadPool.run(task);
        }
     
        getchar();
        return 0;
    }
     
     
     
     
  • 相关阅读:
    20150826运算符,if语句
    20150825数据类型以及数据转换
    !!!SQL sever 函数表达
    SQL
    !!!遍历数组之多维数组!
    数组应用之————二分法查找
    数组-冒泡排列
    Homework!---判断多久过生日
    C#——语句!
    C#——语言基础 之 运算符!
  • 原文地址:https://www.cnblogs.com/henryliublog/p/9482543.html
Copyright © 2020-2023  润新知