Linux编程之线程池的设计与实现(C++98)
代码
假设服务器的硬件资源“充裕”,那么提高服务器性能的一个很直接的方法就是空间换时间,
即“浪费”服务器的硬件资源,以换取其运行效率。
提升服务器性能的一个重要方法就是采用“池”的思路,
即对一组资源在服务器启动之初就被完全创建好并初始化,这称为静态资源分配。
当服务器进入正式运行阶段,即开始处理客户端请求时,如果它需要相关资源就可以直接从池中获取,
无需动态分配。很显然,直接从池中取得所需要资源比动态分配资源的速度快得多,
因为分配系统资源的系统调用都是很耗时的。当服务器处理完一个客户端连接后,
可以把相关资源放回池中,无须执行系统调用释放资源。从最终效果来看,
资源分配和回收的系统调用只发生在服务器的启动和结束,
这种“池”的方式避免了中间的任务处理过程对内核的频繁访问,提高了服务器的性能。
我们常用的线程池和内存池都是基于以上“池”的优势所设计出来的提升服务器性能的方法,
今天打算以C++98设计一个基于Linux系统的简单线程池。
为什么要采用线程池?
首先想一想,我们一般的服务器都是动态创建子线程来实现并发服务器的,比如每当有一个客户端请求建立连接时我们就动态调用pthread_create去创建线程去处理该连接请求。这种模式有什么缺点呢?
动态创建线程是比较费时的,这将到导致较慢的客户响应。
动态创建的子线程通常只用来为一个客户服务,这将导致系统上产生大量的细微线程,线程切换也会耗费CPU时间。
所以我们为了进一步提升服务器性能,可以采取“池”的思路,把线程的创建放在程序的初始化阶段一次完成,这就避免了动态创建线程导致服务器响应请求的性能下降。
线程池的设计思路
以单例模式设计线程池,保证线程池全剧唯一;
在获取线程池实例进行线程池初始化:线程预先创建+任务队列创建;
创建一个任务类,我们真实的任务会继承该类,完成任务执行。