二,线程池:
1,线程池的作用:
通过线程的复用,降低资源消耗(线程创建和销毁造成的消耗);
操作系统是通过线程控制块(Thread Control Block)来管理一个线程的,即创建一个线程首先要创建一个TCB,一个TCB包括下面四种内容:
1)线程标识符(thread ID):线程的ID号。
2)程序计数器(program counter):记录线程当前执行指令下一条的地址。
3)寄存器集(register set):保存CPU中寄存器中的数据,这在线程恢复运行时必须的。
4)栈(stack):用于存储局部变量,和进程的栈没什么区别。
可以看出,线程并没有一个堆。那线程通过new、malloc申请的资源从何二来呢?我们要知道属于同一进程的线程是共享全局变量等资源的。一个线程要申请一块内存,将直接在它所属进程的堆上进行,这样,其他线程就可以访问到本线程创造的数据了。
创建一个线程,需要事先分配这么多资源,自然需要花费一些时间。我们知道,操作系统通过一个链表来管理空闲内存列表的。当程序申请一块内存时,操作系统从空闲内存列表里去寻找一块满足大小的空闲内存,并将地址返回给程序。程序使用完后,又将内存块释放给操作系统。如果我们事先创建一个线程池,里面存放几个创建好的线程,就减少了线程创建的代价,因而可以提高程序的性能。
通过线程的复用,提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。