百度自动驾驶apollo源码解读12:线程池

apollo项目里面有个线程池,源码链接:https://github.com/ApolloAuto/apollo/blob/master/cyber/base/thread_pool.h

仅用一个头文件去实现,此处贴出来源码吧。

1. 源码实现

#ifndef CYBER_BASE_THREAD_POOL_H_
#define CYBER_BASE_THREAD_POOL_H_
 
#include <atomic>
#include <functional>
#include <future>
#include <memory>
#include <queue>
#include <stdexcept>
#include <thread>
#include <utility>
#include <vector>
 
#include "cyber/base/bounded_queue.h"
 
/*
五大池:内存池、连接池、线程池、进程池、协程池
线程池存在的意义:
传统多线程方案中我们采用的服务器模型则是一旦接受到请求之后,即创建一个新的线程,由该线程执行任务。
任务执行完毕后,线程退出,这就是是“即时创建,即时销毁”的策略。尽管与创建进程相比,创建线程的时间
已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器将处于不停
的创建线程,销毁线程的状态。
此线程池有点:使用比较灵活
此线程池缺陷:接口较少,没有一些访问当先线程池转态、强制停止所有任务等接口
尚不明白的地方:task_queue_的类型是std::function<void()>,这个void是函数的返回值吧,那这样
是不是次线程池可以执行的函数体必须是void返回值类型,经过测试,并不是这样。
*/
 
namespace apollo {
namespace cyber {
namespace base {
 
class ThreadPool {
 public:
  explicit ThreadPool(std::size_t thread_num, std::size_t max_task_num = 1000);
 
  template <typename F, typename... Args>
  auto Enqueue(F&& f, Args&&... args)
      -> std::future<typename std::result_of<F(Args...)>::type>;
 
  ~ThreadPool();
 
 private:
  std::vector<std::thread> workers_;
  BoundedQueue<std::function<v

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 10:06:07       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 10:06:07       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 10:06:07       45 阅读
  4. Python语言-面向对象

    2024-07-20 10:06:07       55 阅读

热门阅读

  1. 网络协议-SOTP 协议格式

    2024-07-20 10:06:07       17 阅读
  2. CSS基础到进阶:掌握网页布局的艺术

    2024-07-20 10:06:07       16 阅读
  3. Emacs的插件生态系统

    2024-07-20 10:06:07       18 阅读
  4. ES6 正则的扩展(十九)

    2024-07-20 10:06:07       19 阅读
  5. golang中实现LRU-K算法(附带单元测试)

    2024-07-20 10:06:07       19 阅读
  6. 23年阿里淘天笔试题 | 卡码网模拟

    2024-07-20 10:06:07       16 阅读
  7. 前端经验:使用sheetjs导出CSV文本为excel

    2024-07-20 10:06:07       16 阅读