美文网首页
多线程引起死锁的几种情况及解决办法

多线程引起死锁的几种情况及解决办法

作者: 北京的天空 | 来源:发表于2016-09-08 16:26 被阅读0次

    1.第一种情况:dispatch_sync(dispatch_get_main_queue(), ^{}引起死锁

    NSLog输出1后,主队列的同步线程,按照FIFO的原则(先入先出),2排在3后面会等3执行完,但因为同步线程,3又要等2执行完,相互等待成为死锁。

    - (void)deadLockCase1 {

        NSLog(@"1");

    dispatch_sync(dispatch_get_main_queue(), ^{

           NSLog(@"2");

         });

          NSLog(@"3");

    }

    解决办法:把同步线程放在全局队列里,即可解决。

    - (void)deadLockCase2 {

    NSLog(@"1");

    //3会等2,因为2在全局并行队列里,不需要等待3,这样2执行完回到主队列,3就开始执行

    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

    NSLog(@"2");

    });

    NSLog(@"3");

    }

    2.第二种情况:

    - (void)deadLockCase2 {

    dispatch_queue_t serialQueue = dispatch_queue_create("com.starming.gcddemo.serialqueue", DISPATCH_QUEUE_SERIAL);

    NSLog(@"1");

    dispatch_async(serialQueue, ^{//异步线程

    NSLog(@"2");

    //串行队列里面同步一个串行队列就会死锁

    dispatch_sync(serialQueue, ^{

    NSLog(@"3");

    });

    NSLog(@"4");

    });

    NSLog(@"5");

    }

    打印结果:1,5,2

    解决办法:

    - (void)deadLockCase4 {

    NSLog(@"1");

    dispatch_async(dispatch_get_global_queue(0, 0), ^{

    NSLog(@"2");

    //将同步的串行队列放到另外一个线程就能够解决

    dispatch_sync(dispatch_get_main_queue(), ^{

    NSLog(@"3");

    });

    NSLog(@"4");

    });

    NSLog(@"5");

    }

    3.第三种情况,死循环

    - (void)deadLockCase3 {

    dispatch_async(dispatch_get_global_queue(0, 0), ^{

    NSLog(@"1");

    //回到主线程发现死循环后面就没法执行了

    dispatch_sync(dispatch_get_main_queue(), ^{

    NSLog(@"2");

    });

    NSLog(@"3");

    });

    NSLog(@"4");

    //死循环

    while (1) {

    //

    }

    }

    打印结果:4,1

    相关文章

      网友评论

          本文标题:多线程引起死锁的几种情况及解决办法

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