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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 从哪说起呢? 单纯讲多线程编程真的不知道从哪下嘴。。 不如我直接引用一个最简单的问题,以这个作为切入点好了 在ma...
    Mr_Baymax阅读 2,950评论 1 17
  • iOS多线程编程 基本知识 1. 进程(process) 进程是指在系统中正在运行的一个应用程序,就是一段程序的执...
    陵无山阅读 6,389评论 1 14
  • 一.概述 1.基本概念 同步与异步的概念 同步 必须等待当前语句执行完毕,才可以执行下一个语句。 异步 不用等待当...
    Jt_Self阅读 559评论 0 1
  • 第八天了,坚持的时间已经过半,不知道我的第15天会不会有。 但我希望,到了第十五天,少了打卡的约束,我还在坚持更新...
    一隻兔几阅读 317评论 0 0
  • 昨晚看了《悲伤逆流成河》,和小说基调是一样的,很悲伤的感觉,一个悲情脸的女主,基本的情节也主要和小说一样,只是结局...
    朴实的右手阅读 126评论 0 0

友情链接更多精彩内容