多线程面临的挑战

1、多线程的目的是为了让程序运行的更快,但是并不是创建的线程越多越好,因为多线程面临着如下问题:

线程上下文切换;

死锁的问题;

受限与硬件和软件资源的问题;

2、线程上下文切换

单核处理器也可以执行多线程的任务,因为cpu通过给线程分配时间碎片来做到;时间片是cpu分配给每个线程的执行时间;该时间很短,cpu需要不停在的各个线程间切换,以达到多线程的目的;cpu通过循环算法来分配时间碎片,但是在切换前需要保存每个线程当前的执行状态信息,以便之后在切换回来,但是这样切换的效率是很低的。

使用vmstat 1命令测量上下文切换的次数,cs表示上下文切换次数;

3、如何减少上下文切换

(1)无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时可以使用避免使用锁,如按照数据id取hash算法取模分段,不同的线程处理不同段的数据(Segment),如:把一个list切分为不同段,分段处理也是一种方法;

(2)CAS算法

   使用cas算法来更新数据,不需要使用锁,以此减少锁带来的多线程问题。

(3)使用最少线程

    创建合理的线程数,不要任务很少但是却创建来很多的线程。

(4)协程

   在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。

你可能感兴趣的:(多线程面临的挑战)