多线程的优缺点以及替代方案+锁为什么影响线程的执行效率

进程是cpu分配资源的基本单位。而线程是一个代码段,就是一段代码。线程是程序(代码)执行的基本单元。(可以理解为一个线程就是一段代码),多线程 是采用时间片的方式分片执行,一个线程执行规定时间后就会让出cpu给另外一个线程执行。

多线程的任务执行相当于是一个消费者,去执行任务。多个线程的好处体现在一下几个方面:

1.避免一个线程在按照顺序执行多个任务时 一个任务没有执行完等待,造成其他任务也等待就造成了多任务因为一个没执行完造成其他任务不能即时被执行的情况。

2.程序的执行速度快,多个线程切换以时间片的方式分片运行看起来同时执行,这样合理利于了cpu的性能,(注意线程的切换时有开销的,少量的线程开销并不大)

 我们知道cpu上下文的切换是会有开销的(这里线程的切换是cpu上下文切换的一种)。开销在两个方面     1.cpu资源的开销   2.时间上也有开销   

而线程太多就会导致这个时间的开销比列变大,造成性能的降低。

多线程去任务队列中取任务会出现多个线程同时操作任务队列出现竞态条件。于是需要对任务队列枷锁操作。  锁导致多线程性能降低的原因是,队列加锁导致其他无锁的线程不能访问队列,只能等待。这个等待时间。就是造成性能降低的原因。互斥锁是最基本的锁造成这个等待时间比较长。因此对于锁上的优化出现除了读写锁,条件等待 原则操作,自旋锁 无锁实现等都是为了优化这个等待的时间来提升性能。  以及更加高效的半同步半异步模式。

这里提一嘴,多线程的同步和异步以及多线程间的通讯。

首先同步和异步描述的都是两个或多个线程之间。异步指多个线程同时执行互补干扰,而同步指的是,多个线程在执行到某个操作时需要按照先后顺序来执行(明显同步时多线程执行有关联的情况下用的)。

在服务器中存在同步和异步的概念。其实对于描述的对象有两种,第①种是操作系统的内核空间和用户空间作为2个描述对象他们之间的同步与异步(阻塞io与非阻塞io,在执行recv或send时是否等待内核(buffer缓冲存储区)数据是不是准备好,没准备好就阻塞在这个函数这里,准备好recv会返回不再阻塞继续往下执行代码。更加细致地说就是用户代码执行的线程与 操作系统内核代码线程,可以简这样理解  当你写一段代码执行时 执行到一个函数 比如malloc申请内存时这个时候内核内部就会执行代码分配内存这个过程是内核态,用户态的线程就是在等待(或称为阻塞/挂起/休眠、等待都是一个意思)等内核分配好内存后函数返回用户线程继续执行。 第②种:描述的是用户态线程与线程之间的同步与异步即多线程同步与异步。

那么线程间通讯?为什么要线程间通讯呢?以下几个场景会进行线程通讯。1一个线程需要发生异常信号或者终端信号给另外一个线程2多个线程协同完成一项任务

当要成功完成一件事,需要按照顺序完成几个步骤,那这个步骤看成几个任务,每个任务由对应的线程执行,(这么做在并发处理上是很高效的,上面讲到多线程避免了因为一个任务没执行完造成其他任务不能被执行。当然这里说的=是不同的流程中自行体会)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值