美文网首页
关于GCD队列死锁的分析

关于GCD队列死锁的分析

作者: 流年划过颜夕 | 来源:发表于2019-03-18 15:49 被阅读0次

在主线程中执行主队列同步任务,会发生什么?
以下代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setSyncDueue];
  
}

- (void)setSyncDueue
{
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_sync(queue, ^{
        NSLog(@"打印同步执行");
    });
}

答案是死锁

深入研究其原因:
关于dispatch_get_main_queue();官方解释:

/*!
 * @function dispatch_get_main_queue
 *
 * @abstract
 * Returns the default queue that is bound to the main thread.
 *
 * @discussion
 * In order to invoke blocks submitted to the main queue, the application must
 * call dispatch_main(), NSApplicationMain(), or use a CFRunLoop on the main
 * thread.
 *
 * The main queue is meant to be used in application context to interact with
 * the main thread and the main runloop.
 *
 * Because the main queue doesn't behave entirely like a regular serial queue,
 * it may have unwanted side-effects when used in processes that are not UI apps
 * (daemons). For such processes, the main queue should be avoided.
 *
 * @see dispatch_queue_main_t
 *
 * @result
 * Returns the main queue. This queue is created automatically on behalf of
 * the main thread before main() is called.
 */

这个队列默认是绑定与主线程的。
主线程的执行方式就是同步串行。

死锁原因:
1.以默认主线程进行分析:

它执行完viewDidLoad 方法的依据是
(1)先执行完 [super viewDidLoad];
(2)再执行完 [self setSyncDueue];
这个代码块的任务才算执行完成。

但是当调用[self setSyncDueue]
也就是调用- (void)setSyncDueue 时,
需要等里面的

 NSLog(@"打印同步执行");

执行完成才算这个任务完成:

2.加入的同步主队列的任务进行分析:
下面的任务都会放在主线程中同步执行:

dispatch_sync(queue, ^{
        NSLog(@"打印同步执行");
    });。

根据队列先进先出原则,要执行NSLog(@"打印同步执行");的前提是程序执行完viewDidLoad 方法才行。

所以1.等着2.执行NSLog(@"打印同步执行");,2又等着viewDidLoad 方法执行完,
这就出现了死锁问题。

相关文章

  • 关于GCD队列死锁的分析

    在主线程中执行主队列同步任务,会发生什么?以下代码: 答案是死锁 深入研究其原因:关于dispatch_get_m...

  • 2021--- GCD

    gcd同步,异步,串行队列,并发队列,全局队列,主队列,以及死锁。 1、gcd队列阻塞问题[https://www...

  • GCD死锁

    GCD死锁原因 GCD死锁的原因是队列阻塞,而不是线程阻塞! 串行和并行 串行和并行都是相对于队列而言的-队列(负...

  • 同步串行导致的死锁问题

    GCD中同步操作dispatch_sync()中队列使用主队列会导致线程死锁,是众所周知的事情。但是是如何造成死锁...

  • iOS多线程梳理-GCD(3)

    上一篇 iOS多线程梳理-GCD死锁 GCD栅栏函数 仅在自己创建的并发队列上有效,在全局(Global)并发队列...

  • 说说GCD中的死锁

    本文主要举例说明GCD里的死锁场景,分析造成死锁的原因以及解决方案 在开始说GCD死锁之前,我们先了解一下GCD的...

  • 552,GCD的死锁(面试点:gcd死锁:一,主线程调用主线程。

    本文主要举例说明GCD里的死锁场景,分析造成死锁的原因以及解决方案 在开始说GCD死锁之前,我们先了解一下GCD的...

  • gcd多线程任务与队列组合分析

    关于gcd中串行队列并行队列,以及同步任务和异步任务的花式嵌套,分析执行结果 多线程调试常用代码: gcd的任务 ...

  • GCD 细细的读

    目录 前言 为什么选择GCD? 串行队列、并行队列、同步、异步 线程死锁解析 DispatchQueue的使用 D...

  • 16-多线程-01

    一、GCD 串行队列产生的死锁:只要使用sync函数往同一个串行队列中添加任务,就会产生死锁。只要改为async函...

网友评论

      本文标题:关于GCD队列死锁的分析

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