iOS-多线程死锁问题

作者: cdcyd | 来源:发表于2018-08-02 11:51 被阅读21次

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

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

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

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

    // 串行
    let serQueue = DispatchQueue(label: "serial")
    

    申请一个并行队列

    // 并行
    let conQueue = DispatchQueue(label: "concurrent", attributes: .concurrent)
    

    串行同步、串行异步

    // 串行同步
    serQueue.sync {
         print("串行同步")
    }
    // 串行异步
    serQueue.async {
         print("串行异步")
    }
    

    并行同步、并行异步

    // 并行同步
    conQueue.sync {
         print("并行同步")
    }
    // 并行异步
    conQueue.async {
         print("并行异步")
    }
    

    死锁情况
    线程相互依赖

    let opA = Operation()
    let opB = Operation()
    
    opA.addDependency(opB)
    opB.addDependency(opA)
    

    串行中同步

    // 死锁
    serQueue.async {
         serQueue.sync {
              print(1)
         }
    }
    serQueue.sync {
         serQueue.sync {
              print(1)
         }
    }
    

    相关文章

      网友评论

        本文标题:iOS-多线程死锁问题

        本文链接:https://www.haomeiwen.com/subject/cwqjvftx.html