大多数的网络服务器,包括Web服务器都具备一个特色,就是单位时间内必须处理数目巨大的链接请求,可是处理时间倒是比较短的。 在传统的多线程服务器模型中是这样实现的:一旦有个请求到达,就建立一个新的线程,由该线程执行任务,任务执行完毕以后,线程就退出。这就是”即时建立,即时销毁”的策略。 尽管与建立进程相比,建立线程的时间已经大大的缩短,可是若是提交给线程的任务是执行时间较短,并且执行次数很是频繁,那么服务器就将处于一个不停的建立线程和销毁线程的状态。这笔开销是不可忽略的,尤为是线程执行的时间很是很是短的状况。
假设一个服务器完成一项任务所需时间为:T1 建立线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。若是:T1 + T3 远大于 T2,则能够采用线程池,以提升服务器性能。
线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提升服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了。服务器
线程池实现原理是这样的:在应用程序启动以后,就立刻建立必定数量的线程,放入空闲的队列中。这些线程都是处于阻塞状态,这些线程只占一点内存,不占用CPU。当任务到来后,线程池将选择一个空闲的线程,将任务传入此线程中运行。当全部的线程都处在处理任务的时候,线程池将自动建立必定的数量的新线程,用于处理更多的任务。执行任务完成以后线程并不退出,而是继续在线程池中等待下一次任务。当大部分线程处于阻塞状态时,线程池将自动销毁一部分的线程,回收系统资源。网络
2.函数接口运用步骤:多线程
1,初始化线程池 bool init_pool(thread_pool *pool, unsigned int threads_number); 2,添加任务 bool add_task(thread_pool *pool, void *(*do_task)(void *arg), void *task); 3,销毁线称池 bool destroy_pool(thread_pool *pool);
用线程池并发拷贝目录(目录和普通文件) 1.不用线程实现目录拷贝 2.用线程实现 3.用线程池实现