OC-死锁

作者: 紫云夕月 | 来源:发表于2021-09-08 15:31 被阅读0次

在同一个线程里面,调用同一个串行队列会发生死锁现象

//发生死锁
-(void)oneTest
{
    NSLog(@"1");//任务1
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"2");//任务2
    });
    NSLog(@"3");//任务3
    //首先会执行任务1毫无疑问,然后程序遇到了同步线程,任务三要等待同步线程执行完再执行,而主线程是一个特殊的串行对了。遵循FIFO原则来执行任务,然后任务二被加在任务三的后面要等待任务三完成才执行,这样就进入了互相等待的局面。
}
//不会死锁
-(void)twoTest
{
    NSLog(@"1");//任务1
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0), ^{
        NSLog(@"2");//任务2
    });
    NSLog(@"3");//任务3
    //毫无疑问首先执行任务一,然后遇到了同步线程,任务三要等待同步线程执行完再执行,然后任务二被加在了子线程,在子线程执行完任务二然后回到主线程继续执行任务三
}
//发生死锁
-(void)threeTest
{
    dispatch_queue_t queue = dispatch_queue_create("com.GCD.serial", DISPATCH_QUEUE_SERIAL);
    NSLog(@"1");//任务1
    dispatch_async(queue, ^{
        NSLog(@"2");//任务2
        dispatch_sync(queue, ^{
            NSLog(@"3");//任务3
        });
        NSLog(@"4");//任务4
    });
    NSLog(@"5");//任务5
    //首先,执行任务一,毫无疑问,然后遇到异步线程操作,任务5不必等一步线程操作完再执行,所以任务2和任务5执行先后不一定,二异步操作dispatch_async(queue,^{})中是串行队列操作DISPATCH_QUEUE_SERIAL,任务二和任务四与任务三依次执行,而任务三在同步队列中,任务四又要等任务三执行完再执行,这样就造成了任务三和任务四互相等待的结局,死锁
}
//不会死锁
-(void)fourTest
{
    NSLog(@"1");//任务1
    dispatch_async(dispatch_get_global_queue(0,0), ^{
        NSLog(@"2");//任务2
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"3");//任务3
        });
        NSLog(@"4");//任务4
    });
    NSLog(@"5");//任务5
    //显然,首先执行任务1,然后遇到异步全局队列,所以异步队列和任务5同时执行,不分先后,然后异步队列中先执行任务2,遇到同步主队列,任务4要等任务3完成之后执行,而任务3和任务4四不在一个队列里,所以任务3不必等待任务4的完成。所以,整个案例的执行结果是:15234或者12534
}
//发生死锁
-(void)fiveTest
{
    dispatch_sync(dispatch_get_global_queue(0,0), ^{
        NSLog(@"1");//任务1
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"2");//任务2
        });
        NSLog(@"3");//任务3
    });
    NSLog(@"4");//任务4
    while (1) {

    }
    NSLog(@"5");//任务5
    //首先是异步线程,任务4不用等待任务1的执行,同时执行,所以任务1和任务4肯定能执行到,顺序不一定,然后任务4之后遇到死循环不再往下执行任务5,而异步队列中任务2又被加入了串行主队列任务5的后面,所以任务2也不会执行,而任务1在之前之后遇到同步操作,任务3要等待任务2结束后再执行,所以任务3也不会执行,因此最后结果是1 4或者4 1。
}
//发生死锁
-(void)sixTest
{
    NSLog(@"1");
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"2");
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"3");
        });
        NSLog(@"4");
    });
    NSLog(@"5");
}
//发生死锁
-(void)sevenTest
{
    NSLog(@"1");
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"2");
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"3");
        });
        NSLog(@"4");
    });
    NSLog(@"5");
}

相关文章

  • OC-死锁

    在同一个线程里面,调用同一个串行队列会发生死锁现象

  • 导航控制器全透明

    OC- (void)viewWillDisappear:(BOOL)animated{ [self.naviga...

  • 死锁

    线程饥饿死锁 锁顺序死锁 动态锁顺序死锁通过锁顺序来避免死锁 避免死锁

  • 死锁

    第11章:死锁和进程通信 死锁概念 死锁处理方法 死锁预防(Deadlock Prevention) 死锁避免(D...

  • java多线程笔记

    产生死锁的四个必要条件 处理死锁的基本方法 死锁预防 死锁避免 死锁检测 死锁解除 https://blog.cs...

  • [现代操作系统]--死锁

    table of content 死锁定义 死锁建模-- 资源分配图 处理死锁鸵鸟算法检测并恢复死锁检测死锁恢复利...

  • Java-多线程(四)死锁

    死锁 死锁示例

  • Cur curs cours=run 跑

    Occur = oc-向 v.出现,发生 Occurrence -ence n.出现 Occ...

  • Java死锁

    什么是死锁 死锁检测 产生死锁的四个必要条件 如何避免死锁 死锁 死锁,指两个或多个线程之间,由于互相持有对方需要...

  • java并发--java死锁

    本篇结构: 前言 什么是死锁 产生死锁的必要条件 死锁的代码示例 死锁排查 如何避免死锁 总结 一、前言 今天被问...

网友评论

      本文标题:OC-死锁

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