线程池中如何确定线程的数目

我用C写了一个线程池,但是在写的时候没有考虑线程池中线程的数目,当初直接随便设定了一个线程的数目。

但是在面试时,将常被问到如何设定线程池中线程的数目的?

我也在网上了搜了一些资料,今天在这里就说一下“如何设定线程池中线程的数目?”


线程池中线程的数目是跟线程池所要处理的任务性质有关的

  1. 任务的性质:CPU密集型任务、IO密集型任务、混合型任务。
  2. 任务的优先级:高、中、低。
  3. 任务的执行时间:长、中、短。
  4. 任务的依赖性:是否依赖其他系统资源,如数据库连接等。

性质不同的任务可以交给不同规模的线程池执行。

针对不同的任务性质而言:CPU密集型任务应配置尽可能小的线程,如配置CPU个数+1的线程数,IO密集型任务应配置尽可能多的线程,因为IO操作不占用CPU,不要让CPU闲下来,应加大线程数量,如配置两倍CPU个数+1,而对于混合型的任务,如果可以拆分,拆分成IO密集型和CPU密集型分别处理,前提是两者运行的时间是差不多的,如果处理时间相差很大,则没必要拆分了。

任务对其他系统资源有依赖:如某个任务依赖数据库的连接返回的结果,这时候等待的时间越长,则CPU空闲的时间越长,那么线程数量应设置得越大,才能更好的利用CPU。 

线程等待时间所占比例越高,这样的话CPU空闲时间比较多,为了能够更好的利用CPU,需要较多线程。

如果线程CPU时间所占比例越高,说明CPU比较繁忙,此时需要越少线程。 

另外,如果线程数量过多,线程之间的切换也会带来开销。


是否使用线程池就一定比使用单线程高效呢?

答案是否定的,比如Redis就是单线程的,但它却非常高效,基本操作都能达到十万量级/s。从线程这个角度来看,部分原因在于:多线程带来线程上下文切换开销,单线程就没有这种开销。

原文链接:https://blog.csdn.net/bian_qing_quan11/article/details/78030016

猜你喜欢

转载自blog.csdn.net/a_blackmoon/article/details/80986968