美文网首页
GCD线程死锁

GCD线程死锁

作者: 我是繁星 | 来源:发表于2018-07-02 19:18 被阅读0次

    GCD 以下情况下会死锁,(不考虑线程锁的情况下)

    • 主队列中同步添加任务。
    DispatchQueue.main.sync {
                print("任务")
            }
    
    • 串行队列任务中添加同步任务
    var queue = DispatchQueue.init(label: "serialQueue", attributes: .init(rawValue: 0))
    queue.sync {
                print("任务1")
                queue.sync(execute: {
                    print("任务2")
                })
            }
    

    为什么呢?,先说说主队列和全局并发队列
    全局并发队列:本质是一个并发队列,由系统提供,方便编程,可以不用创建就直接使用。
    和并发队列的区别:
    1.全局队列没有名字,但是并发队列有名字。有名字可以便于查看系统日志
    2.全局队列是所有应用程序共享的。
    3.在mrc的时候,全局队列不用手动释放,但是并发队列需要。

    主队列:比较特殊的,它专门负责主线程的任务调度,即使异步执行也不会开辟新的线程。任务只会在主线程中顺序执行。

    • 第一个例子是因为主队列在代码运行的时候是不调度任务的,所以同步任务无法添加,但是同步任务不执行完就无法继续执行,造成了双向等待,所以死锁了

    • 第二个例子很简单,理解了同步的概念就好了
      同步执行:如果有两个任务1、2,顺序添加到串行任务队列中同步执行,必须执行完任务1(也就是block中的代码),再执行任务2。
      看上面代码因为在任务1中向队列中添加了任务2,任务2在等任务1执行完,任务1在等任务2执行完,双向等待,死锁了。

    相关文章

      网友评论

          本文标题:GCD线程死锁

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