线程池
文章平均质量分 83
设计并实现轻量级高并发线程池ThreadPool。ThreadPool作为独立模块,并入eterfree库,采用C++标准库,不依赖第三方库,易跨平台。ThreadPool提供线程管理策略,和线程安全的接口,引入动态调整线程数量的算法等。
独孤过
精诚所至,金石为开
展开
-
线程池设计原理
线程实现方式线程有三种实现方式,分别是内核级线程、用户级线程和组合型线程。内核级线程:拥有一个内核对象和一个栈,占据着操作系统的一块内核空间,其创建、阻塞、切换和销毁都访问操作系统接口,由内核来完成,应用程序不进行线程管理。每个用户线程在其生命周期内被绑定到一个内核线程,一旦用户线程终止,两个线程都被系统销毁。这种模式称为“一对一”线程映射。用户级线程:在用户空间实现,对于线程的创建、销...原创 2019-01-31 21:14:26 · 470 阅读 · 0 评论 -
C++17 强化条件变量类模板
条件变量只激活进入等待队列的线程,无法确保激活在阻塞之后,存在激活先于阻塞问题。结合条件变量、谓词和临界区,封装强化条件变量。以谓词决定阻塞和激活,两种操作分别放于临界区,确保操作互斥。似此只存在两种情况,一种是激活在阻塞之后,另一种是谓词为真而线程不必阻塞,足以应对激活先于阻塞问题。原创 2021-06-25 03:48:09 · 934 阅读 · 1 评论 -
C++17 双缓冲队列类模板
双缓冲队列分为入口队列与出口队列,在访问两个队列之时,分别采用入口互斥元和出口互斥元。其优势在于仅当取出元素而出口队列为空时,访问两个队列才相互影响,如此可以提高元素出入队列的效率。原创 2019-05-15 13:03:05 · 1783 阅读 · 4 评论 -
C++17 线程类
线程类提供线程重用方案,支持销毁再创建,一次创建反复使用。线程类灵活性高,既作为独立模块,也作为线程池的线程,既可以配置单任务,也可以配置任务队列。线程类支持配置任务队列,可以实现单线程独占任务队列,按照出队列之顺序执行任务;也可以实现多线程共享任务队列,不过需要确保队列接口线程安全。原创 2019-10-14 23:14:53 · 4129 阅读 · 2 评论 -
C++17 线程池类
线程池是一种池化资源技术,也是一种多线程模式。线程池调度线程执行任务,通常序列化任务,形成任务队列。调度的关键在于条件变量。当不满足执行条件时,阻塞线程以让出处理器,在满足条件之前,不占用处理器,以提高资源利用率。线程池提供设置容量方法,由守护线程异步增删工作线程。当任务队列非空时,一次性增加工作线程;当存在闲置工作线程时,逐个删减工作线程。原创 2019-10-23 04:18:46 · 3045 阅读 · 2 评论 -
程序设计技巧
程序设计技巧编译依存性源文件改动之后,单独编译并且链接。而头文件改动之后,所有直接或者间接引用此头文件的文件会重新编译并链接,这是文件间的编译依存性。线程泄漏线程执行任务时,若任务发生错误抛出异常,而未处理异常,线程被强制打断,无法正常执行,导致资源泄漏。虚假唤醒当一个线程通过条件变量发送唤醒信号,唤醒单个或者多个阻塞于此条件变量的线程,然而对于被唤醒的线程来说,存在不满足执行条件的情况。唤醒先于阻塞一线程通过条件变量发出唤醒信号可能先于另一线程等待条件变量。...原创 2019-10-18 14:02:59 · 379 阅读 · 0 评论 -
智能指针std::shared_ptr之循环引用
类的成员变量包含共享指针,假设类的两个实例由共享指针管理,分别称为此实例与彼实例,此实例的共享指针指向彼实例,而彼实例的共享指针指向此实例。上述情况可以视为,由共享指针管理的外层对象持有内层对象,而内层对象以共享指针形式直接或者间接引用外层对象。销毁外层对象的前提是内层对象不再引用外层对象,而内层对象在析构之时才解除引用,即必须先销毁外层对象。似此对象之间跨层级相互引用,而无法解除引用关系,形成循环引用。原创 2019-10-23 03:46:59 · 2875 阅读 · 2 评论 -
编译依存性
在改动源文件之后,源文件只需要单独编译并链接。而在改动头文件之后,直接或者间接引用头文件的源文件都需要重新编译并链接,这是文件间的编译依存性。降低编译依存性之构想:相依于声明式,不相依于定义式。编译依存性最小化的本质是接口与实现分离,其关键在于以声明依存性替换定义依存性。接口与实现分离用于隐藏实现细节,而内联的前提是显示实现细节,二者相互矛盾。采用实现细节隐藏技巧,意味着仅限定义式所在源文件定义与调用内联函数。编译器优化策略可以无视内联局限性。原创 2021-06-28 13:44:05 · 283 阅读 · 0 评论 -
线程池性能测试
Eterfree线程池以一个基于Boost程序库的线程池为参照线程池,分别在不同硬件、不同操作系统的计算机对两种线程池进行性能测试。最近一次以Visual Studio 2019编译x64 Release版本的测试程序,一共进行10次测试,每次测试以100个线程执行300000个相同任务。记录线程池执行的任务数和所用时间,计算每毫秒执行的任务数,最终取执行任务的平均速度。原创 2019-05-15 13:05:18 · 2034 阅读 · 0 评论