之前 『ios』主线程 和 主队列的关系,绝对安全的UI操作,主线程中一定是主队列?在这片文章中,总结了下主线程和主队列的关系。昨天有人在下面评论,纠结死锁的条件。正好,自己也总结下。
在测试之前我的理解:死锁的条件,就拿主线程来说,在主线程中,必须满足是同步主队列才会死锁。也就是说,必须是不会开辟新线程,并且是在同一队列中才会造成死锁,有一个不满足就不会造成死锁。
下面是测试案例
第一种情况 我们通常见到的死锁情况。
主线程中
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"%@",[NSThread currentThread]);
});
第二种情况 新建一个串行队列同步执行
主线程中
dispatch_queue_t queue = dispatch_queue_create("test1", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
});
这种情况不会死锁 ,因为不是同一队列中
第三种情况 新建一个串行队列同步执行 并且在里面嵌套一个同一串行队列同步执行。
主线程中
dispatch_queue_t queue = dispatch_queue_create("test1", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
dispatch_sync(queue, ^{
});
});
这种情况会死锁,因为是在同一队列 test1 中,并且同步执行不开辟新线程。
第四种情况 新建二个串行队列同步执行
dispatch_queue_t queue = dispatch_queue_create("test1", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queue1 = dispatch_queue_create("test2", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue1, ^{
dispatch_sync(queue, ^{
});
});
这种情况不会造成死锁,会顺序执行,因为是两个不同的队列中。
通过上面这四种情况的验证,证明上面我的思路是正确的。
网友评论