首页 > 多线程在什么时候使用合适

多线程在什么时候使用合适

看过一本书,上面说到为什么使用多线程可以提高效率,主要的原因有两个:IO等待和多CPU。

多CPU

显然有多个CPU就可以同时执行多个任务,每个线程就相当于一个任务。

IO等待

假如有一个线程在执行的时候,遇到了磁盘读写或者网络传输阻塞,那么线程就需要等待,这时候占用的CPU就可以释放,然后CPU就可以将时间片分给其他线程,等待这个线程IO等待结束了,CPU再把时间片分给它,这样就可以合理安排CPU时。

如果是计算型的线程,那么计算型线程的个数不要超过CPU的个数,因为计算型线程没有IO等待,会一直运行,那么就会一直占用CPU资源,所以CPU就不会切换去执行其他的线程,这种情况下如果计算型线程数多于CPU个数的话,就没有CPU能够空出来去执行多出来的线程。

我的疑问

是不是并不是一定要有IO阻塞才能利用多线程,比如可以在一个线程的执行方法里面使用sleep,让线程睡眠,也产生了线程等待的效果,这时候CPU就会去执行其他线程,是不是这样?

另外,四种线程同步的方式(临界区、互斥对象、事件对象、信号量),比如线程在等待事件对象的时候,CPU是会一直执行这个线程还是在这个等待的时间去执行其他的线程?其他的几种线程同步方式,CPU是怎么分配时间片的?


不一定非得有 IO 阻塞才能用多线程,也不用 sleep 就可以让 CPU 去执行别的线程。

即使全是计算任务,操作系统也会照顾所有线程的,尽量不会让一个线程饿死。

因同步而发生等待时,一般会主动触发线程调度,所以 CPU 可能会在某个线程等待的时候去执行其他线程。

有些“锁”,比如自旋锁,是采用忙等的方式进行同步的,这种锁在等待的时候可能就不主动触发线程调度,而只能等时间片用完之后再进行线程调度了。


不一定 多线程 可以干很多事儿 不一定非IO阻塞
比如 如果你建立一个串行队列 去访问10个图片 每个图网络IO大概1秒 那就需要10秒
如果多线程就可以用1秒搞定这个事儿
如果你各线程处理的时间不一样 又要组合结果 就得有线程同步这个事儿了
你的第一个问题 线程其实是同步执行的 但是 都是可控的 完成时间不一定可控

时间片 应该是按照线程优先级 来处理 如果你放到并发队列中 应该是同时执行,但是处理的优先级 你是可以控制的。比如在Mac系统中 你通过GCD发起新线程 是可以放到不同优先级的队列中去得

【热门文章】
【热门文章】