线程池的设计
对于线程池可以有很对中设计,最常见的有master-slave模型,和通用线程池。
1. master-slave:一个主控线程和多个工作线程,线程池的调度由master线程来执行。
2. 通用线程池,如常见的半同步半异步线程池。线程池中的所有线程的地位平等,线程池的所有线程平等竞争池中的任务(variable_condition)
3. 设计线程池的原因:线程池的目的在于更大效率的使用线程(增大线程的利用率)
线程池的使用场景
一般的情况下,我们对线程池的设计遵循泛型的设计,就是可以向线程池中投递任意类型的task,这一点使用闭包(lambda)可以很容易就实现。线程池的使用场景更应该是task之间相互独立的情况下效率会更高。
设有如下场景:
Resource A;
threadpool thpool(10);//线程池中有10个线程.
thpool.commit([]{
A;//....使用资源A
//.....
});
thpool.commit(
A;//...
//.....
);
将两个task都投递到线程池,由两个线程得到task,执行,但是两个线程执行过程中都会涉及到对资源A的使用,那么此时
将在资源A产生资源竞争,就需要进行同步。其中某一个线程就需要等待,这大大减少了线程的利用率,特别是在资源竞争频繁的情况下。
所以,可以得到如下总结:线程池的设计是为了增大线程的使用效率,线程池适合task之间耦合性小(资源竞争小)的情景。