基于 C++ 手写线程池
前言
本文将基于 C++ 手写一个线程池,并分别提供 C++ 11 和 C++ 17 两种版本的线程池实现。线程池作为五大池之一(内存池、连接池、协程池、线程池、进程池),应用非常广泛,不管是客户端程序,还是后台服务程序,都是提高业务处理能力的必备模块。有很多开源的线程池实现,虽然各自接口在使用上稍有区别,但是其核心实现原理都是基本相同的。
知识背景
在基于 C++ 手写线程池之前,应该熟悉并掌握以下技术内容:
- 熟练基于 C++ 11 的面向对象编程
- 熟悉组合和继承、继承多态、STL 容器、智能指针、函数对象、绑定器、
lambda
表达式、可变参数模板编程等。 - 熟悉 C++ 11 多线程编程,比如线程互斥、线程同步、原子操作、CAS 等。
- 熟悉
thread
、mutex
、unique_lock
、condition_variable
、atomic
等。 - 熟悉 C++ 17 和 C++ 20 的新特性,比如 C++ 17 的
any
类型和 C++ 20 的counting_semaphore
信号量类型等。
Nginx 内存池源码剖析
SGI STL 内存池源码剖析
C++ 网络编程 Muduo 库使用
基于 C++ 实现 MySQL 数据库连接池
大纲
前言
在 C/C++ 项目中,为了提高 MySQL Server 的访问效率,基于 C++ 11 实现数据库连接池,并使用 MySQL Connector/C++ 库。
项目背景
为了解决 MySQL 数据库(基于 C/S 设计)的访问瓶颈,除了在服务器端增加缓存服务器缓存常用的数据之外(例如 Redis),还可以增加连接池,来提高 MySQL Server 的访问效率。在高并发情况下,大量的 TCP 三次握手、MySQL Server 连接认证、MySQL Server 关闭连接回收资源和 TCP 四次挥手所耗费的性能时间也是很明显的,增加连接池就是为了减少这一部分的性能损耗。在市场上比较流行的连接池包括 C3P0、Apache DBCP、HikariCP、阿里巴巴的 Druid 连接池,它们对于短时间内大量的数据库增删改查操作性能的提升是很明显的,但是它们有一个共同点就是,全部都是由 Java 实现的。