前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS-多线程死锁问题

iOS-多线程死锁问题

作者头像
用户2215591
发布2018-08-09 17:01:48
8850
发布2018-08-09 17:01:48
举报
文章被收录于专栏:iOSer成长记录iOSer成长记录

虽然作者在开发中经常会用到多线程,但是对于死锁、线程阻塞等问题还是比较模糊,一般都是先写吧,有问题再改,现在闲下来了,是时候总结一波了,本文主要总结一下同步/异步、串行/并行、死锁、线程阻塞等问题

  • 串行/并行 串行(Serial Queue):同一时间内,队列中只能执行一个任务,只有当前的任务执行完成之后,才能执行下一个任务 并行(concurrent Queue):同时允许多个任务执行(并行队列中才会有多个线程,串行的只有一个线程)
  • 同步/异步 同步(Sync):等到当前的任务执行完成,线程才会继续去执行下面的任务 异步(Async):线程会立即返回,无需等待就会继续直线下面的任务
  • 死锁 两个或以上的线程互相等待彼此执行,通常情况有(在同一串行队列中执行同步操作,或两个线程互相依赖等情况)
  • 阻塞 只要是同步操作都会阻塞一个线程

所以 1.在遇到需要多线程相互依赖的情况,一定要注意,不要两个线程互相依赖,这样会造成死锁 2.在使用同步线程时,要注意不要在同一个串行队列中使用,还要注意线程阻塞问题

下面是相关代码 申请一个串行队列

代码语言:javascript
复制
// 串行
let serQueue = DispatchQueue(label: "serial")

申请一个并行队列

代码语言:javascript
复制
// 并行
let conQueue = DispatchQueue(label: "concurrent", attributes: .concurrent)

串行同步、串行异步

代码语言:javascript
复制
// 串行同步
serQueue.sync {
     print("串行同步")
}
// 串行异步
serQueue.async {
     print("串行异步")
}

并行同步、并行异步

代码语言:javascript
复制
// 并行同步
conQueue.sync {
     print("并行同步")
}
// 并行异步
conQueue.async {
     print("并行异步")
}

死锁情况 线程相互依赖

代码语言:javascript
复制
let opA = Operation()
let opB = Operation()

opA.addDependency(opB)
opB.addDependency(opA)

串行中同步

代码语言:javascript
复制
// 死锁
serQueue.async {
     serQueue.sync {
          print(1)
     }
}
serQueue.sync {
     serQueue.sync {
          print(1)
     }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.08.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档