美文网首页
GCD死锁的理解

GCD死锁的理解

作者: 枭龙gogogo | 来源:发表于2017-10-13 13:21 被阅读0次
- (void)viewDidLoad {
    [super viewDidLoad];
    [self sync];
}
- (void)sync {
    dispatch_queue_t queue = dispatch_get_main_queue();
    NSLog(@"Thread--%@", [NSThread currentThread]);
    dispatch_sync(queue, ^{
        NSLog(@"sync1--%@", [NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"sync2--%@", [NSThread currentThread]);
        dispatch_sync(queue, ^{
    });
    dispatch_sync(queue, ^{
        NSLog(@"sync3--%@", [NSThread currentThread]);
    });
}
  1. 以上代码会造成死锁,原因是viewDidLoad函数会在主线程执行,当主线程中有任务在执行时,主队列内的任务会被阻塞。当代码执行到dispatch_sync时,会将block内的代码放入主队列。因为主队列被viewDidload阻塞了,所以block不会被执行。而dispatch_sync是同步函数,需要block执行完毕后才会返回,所以viewDidload和block相互阻塞,形成死锁。
  2. 如果将同步函数队列换成其他的其他队列,无论是串行队列还是并行队列都不会造成死锁。因为viewDidload被block阻塞时,block和viewDidload不在同一队列,block不会被viewDidload阻塞,当block自行完毕后viewDidload也会继续执行。
  3. 所以GCD的死锁和线程无关,是因为队列的阻塞造成了任务的相互阻塞才形成死锁。如果两个任务不在同一队列内就不会造成死锁。

相关文章

  • 理解GCD死锁

    因为本文只做分享用,非学术性文章,所以某些理论并不是非常严谨,望大家见谅。写下这篇文章有以下的目: 我写这篇文章时...

  • GCD死锁的理解

    以上代码会造成死锁,原因是viewDidLoad函数会在主线程执行,当主线程中有任务在执行时,主队列内的任务会被阻...

  • iOS GCD 死锁理解

    关键字:串行,并行,同步,异步,阻塞,死锁。作者:周辉All rights reserved. 同步(dispat...

  • 说说GCD中的死锁

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

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

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

  • GCD让我死锁的死锁(Two)

    本文目录: 同步执行主队列(在主线程中) 另几种死锁情况 本文参考文章链接: 理解GCD死锁 五个案例让你明白GC...

  • IOS开发 GCD产生死锁的总结

    在IOS开发中GCD的使用频率很高,但是使用不当,则会产生死锁,以下是我的对GCD产生死锁的总结。 了解死锁之前首...

  • GCD 死锁

    GCD死锁 同步 异步 串行 并发

  • 带你分分钟了解GCD多线程的死锁

    带你了解GCD多线程的死锁 阐述: 1.什么是GCD? GCD,全称 Grand Central Dispatch...

  • 死锁 GCD 多线程

    死锁 GCD 多线程 Ios - LDSmallCat - 博客园 Ios中GCD死锁困扰很多人,分享一点个人经...

网友评论

      本文标题:GCD死锁的理解

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