通常在需要大量线程连接或者需要执行异步任务的时候,为了避免线程多次创建的开销,我们可以事先创建一定数量的线程,组成一个线程池。由threadpool统一管理线程的生命期以及任务的添加。
线程池通常由四部分构成
线程池本身结构作为管理器
任务队列
工作线程
往工作线程中添加任务的接口
下面是一个linux下的简单线程池的实现与演示(为了测试方便有些地方直接将pthread_t转换成了int打印,另外一些地方使用了gettid):
上面是一个简单的线程池,限制了线程的数量,任务队列的最大任务数量。我们还可以加一些其他的高级特性,比如在退出时将未完成的队列任务持久化,使用多个队列,给任务产生随机唯一id从而实现cancel,任务延迟等等,不过这些更多的是队列的特性,在一些成熟的产品如beanstalkd等中实现得挺不错了。