# cpp-thread-pool **Repository Path**: yulai-design-pattern/cpp-thread-pool ## Basic Information - **Project Name**: cpp-thread-pool - **Description**: 使用c++ 开发一个半同步半异步线程池 - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-10-08 - **Last Updated**: 2022-05-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 使用c++11 开发一个半同步半异步线程池 ##9.1 半同步半异步线程池介绍 在处理大量并发任务时候,如果按照传统的方式,一个请求一个线程来处理请求,大量的线程创建和销毁将消耗过多的系统资源, 还增加线程上下文切换的开销,而通过线程池技术就可以很好的解决这些问题。线程池技术在系统中预先创建一定数量的线程,当 任务请求到来时候从线程池中分哦诶一个预先创建的线程去处理任务,线程在处理完任务之后还可以重用,不会销毁,而是等待下次 任务的到来。这样,通过线程池能避免大量的堪称创建和销毁动作,宠儿节省系统资源。 ##9.2 线程池实现的关键技术分析 上一节介绍了线程池的基本概念和基本结构,它是由三层组成:同步服务层、排队层和异步服务层,其中排队层处于核心地位。 因为上层会将任务加到排队层中,异步服务层同时也会取出任务,这里由一个同步的过程。在实现时,排队层就是一个同步队列, 允许多个线程同时去添加或取出任务,并且要保证操作过程是安全的。线程池有两个活动过程,一个是往同步队列中添加任务的过程, 另一个是从同步队列中取出任务的过程。 从活动图中可以看出线程池的活动过程,一开始线程池会启动一定数量的线程,这些线程属于异步层,主要用于并行处理排队层 中的任务,如果排队层中的任务数为空,这些线程等待任务的到来,如果发现排队层中有任务了,线程池则会从等待的这些线程中唤醒 一个来处理新任务。同步服务层则不断地将新的任务添加到同步排队层中,这里有个问题值得注意,有可能上层的任务非常多,而任务又是 非常耗时的,这时,异步层中的线程处理不过来,则同步排队中的任务数会不断增加。 c++11 提供了异步操作相关的类,主要有std::future std::promise 和std::package_task。 std::future 作为异步结果的传输通道,可以很方便地获取线程函数的返回值,std::promise 用于包装一个值。 在前面几篇文章中基本都用到thread对象,它是C++11中提供异步创建多线程的工具。但是我们想要从线程中返回异步任务结果,一般需要依靠全局变量; 从安全角度看,有些不妥;为此C++11提供了std::future类模板,future对象提供访问异步操作结果的机制,很轻松解决从异步任务中返回结果。