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

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

作者: 北京的天空 | 来源:发表于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

相关文章

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

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

  • 课堂模拟面试试题

    1、列举一下 Cocoa/Cocoa Touch 中常见的几种多线程方案的实现,并谈谈多线程安全的几种解决办法以及...

  • jstack命令:教你如何排查多线程问题

    这是之前的一个死锁案例: 一个多线程死锁案例,如何避免及解决死锁问题? 如程序中发生这样的死锁问题该如何排查呢?我...

  • iOS/Swift多线程之---如何避免数据竞争(Data ra

    多线程编程中, 常见的问题有 死锁Deadlock死锁指的是由于两个或多个执行单元之间相互等待对方结束而引起阻塞的...

  • UI自动化之selenium元素定位不到问题分析及解决办法

    在编写ui自动化时,经常发生定位不到元素的情况。总结了以下几种情况及解决办法: 表单嵌套 打开了新的窗口 元素当前...

  • C++笔记

    多线程 切忌勿在多线程的时候访问同一线程的内容,会产生死锁,解决办法是用队列(访问队列的时候加锁) 方法返回值为数...

  • ios NSLock死锁及解决办法

    NSLock死锁及解决办法 代码如下: 输出结果:1 这就照成了死锁 原因如下:由于当前线程运行到第一个lock加...

  • iOS线程死锁

    使用sync/async和queue的各种搭配时,常常有产生死锁崩溃的情况,现简单介绍几种死锁场景。 例一 打印了...

  • gcd 死锁相关

    1、出现死锁的情况:使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列(产生死锁); 2、如下几种代码...

  • 死锁及解决办法

    死锁概念及产生原理概念:多个并发进程因争夺系统资源而产生相互等待的现象。原理:当一组进程中的每个进程都在等待某个事...

网友评论

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

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