GCD线程死锁
2018-07-02 本文已影响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执行完,双向等待,死锁了。