zoukankan      html  css  js  c++  java
  • 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;
    }
     
     
     
     
  • 相关阅读:
    jQuery的鼠标悬停时放大图片的效果
    判断一个字符串在另一个字符串中出现的次数
    .net中几个经常用到的字符串的截取
    云服务器 ECS CentOS 7 下重启 sshd 服务操作方法
    博客生涯开始咯
    Json 转 Map 的几种方式
    JS 折线图
    CSS样式优先级
    Arrays.asList 数组转集合 java.lang.UnsupportedOperationException错误
    Netty 笔记
  • 原文地址:https://www.cnblogs.com/henryliublog/p/9482543.html
Copyright © 2011-2022 走看看