并发编程的艺术笔记-并发编程的挑战

并发编程的目的是为了让程序运行的更快,但是,并不是启用更多的线程就能让程序最大程度的并发执行,进行并发编程时,会面临很多挑战,比如上下文呢切换的问题 ,死锁的问题,受限于硬件和软件的资源限制的问题。

上下文切换

CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片之后会切换到下一个任务。切换前会保存上一个任务的状态,以便下一次切换回来时可以再加载这个任务的状态,任务从保存到加载的过程就是一次上下文切换

多线程一定快吗?
不一定,线程有创建和上下文切换的开销。

如何减少上下文切换?

  1. 无锁并发编程
  2. CAS算法
  3. 使用最少线程
  4. 协程

死锁

线程死锁描述的是这样⼀种情况:多个线程同时被阻塞,它们中的⼀个或者全部都在等待某个资源被释 放。由于线程被⽆限期地阻塞,因此程序不可能正常终⽌。
线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对⽅的资源,所以这两个线 程就会互相等待⽽进⼊死锁状态。
在这里插入图片描述
死锁必须具备以下四个条件:

  1. 互斥条件:该资源任意⼀个时刻只由⼀个线程占⽤。
  2. 请求与保持条件:⼀个进程因请求资源⽽阻塞时,对已获得的资源保持不放。
  3. 不剥夺条件:线程已获得的资源在末使⽤完之前不能被其他线程强⾏剥夺,只有⾃⼰使⽤完毕后 才释放资源。
  4. 循环等待条件:若⼲进程之间形成⼀种头尾相接的循环等待资源关系。

如何避免线程死锁?
上⾯说了产⽣死锁的四个必要条件,为了避免死锁,我们只要破坏产⽣死锁的四个条件中的其中⼀个 就可以了:

  1. 破坏互斥条件 :这个条件没有办法破坏,因为我们⽤锁本来就是想让他们互斥的(临界资源需要互斥访问)。
  2. 破坏请求与保持条件 :⼀次性申请所有的资源。
  3. 破坏不剥夺条件 :占⽤部分资源的线程进⼀步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
  4. 破坏循环等待条件 :靠按序申请资源来预防。按某⼀顺序申请资源,释放资源则反序释放。破坏循环等待条件。

参考:
《并发编程的艺术》

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值