多线程作用

1、利用多核cup

现在的服务器大多都是多核cup(双核、4核、8核等),如果程序只跑单线程,就会浪费cpu资源。只有跑多线程时,多核cpu才能有效利用,它能让多段逻辑同时执行。

单核cpu也可以跑多线程,不过是“假的”,同一时间处理器只会处理一段逻辑,只不过线程切换比较快,看着像是多线程“同时”在运行。从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线程上下文的切换,而降低程序整体的效率。

2、防止阻塞

单核CPU我们还是要应用多线程,就是为了防止阻塞。试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据(或其他IO操作(磁盘,数据库,网络等等)),数据迟迟未返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行(阻塞)了。多线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数据阻塞,也不会影响其它任务的执行。

在单核cpu的情况下,多线程的这个消除阻塞的作用还可以叫做“并发”,这和并行是有着本质的不同的。并发是“伪并行”,看似并行,而实际上还是一个CPU在执行一切事物,只是切换的太快,我们没法察觉罢了。

3、建模

这是另外一个没有这么明显的优点了。假设有一个大的任务A,单线程编程,那么就要考虑很多,建立整个程序模型比较麻烦。但是如果把这个大的任务A分解成几个小任务(任务相对独立,互不影响),任务B、任务C、任务D,分别建立程序模型,并通过多线程分别运行这几个任务。

4、什么时候用多线程

4.1 线程越多越好吗?

线程必然不是越多越好,线程切换也是要开销的,当你增加一个线程的时候,增加的额外开销要小于该线程能够消除的阻塞时间,这才叫物有所值。

Linux自从2.6内核开始,就会把不同的线程交给不同的核心去处理。Windows也从NT.4.0开始支持这一特性。

4.2 什么时候才有必要用多线程?

  • 多核CPU——计算密集型任务。此时要尽量使用多线程,可以提高任务执行效率,例如加密解密,数据压缩解压缩(视频、音频、普通数据),否则只能使一个核心满载,而其他核心闲置。
  • 单核CPU——计算密集型任务。此时的任务已经把CPU资源100%消耗了,就没必要也不可能使用多线程来提高计算效率了;相反,如果要做人机交互,最好还是要用多线程,避免用户没法对计算机进行操作。
  • 单核CPU——IO密集型任务,使用多线程还是为了人机交互方便。
  • 多核CPU——IO密集型任务,这就更不用说了,跟单核时候原因一样。

猜你喜欢

转载自blog.csdn.net/xixingzhe2/article/details/85090220