『ios』线程死锁还是队列死锁? 死锁测试

之前 『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, ^{
    
        });
    });

这种情况不会造成死锁,会顺序执行,因为是两个不同的队列中。

通过上面这四种情况的验证,证明上面我的思路是正确的。

想要找一群一起进步的人,请加入我

『ios』线程死锁还是队列死锁? 死锁测试_第1张图片
image.png

你可能感兴趣的:(『ios』线程死锁还是队列死锁? 死锁测试)