美文网首页
GCD 使用过程中的出现的死锁问题

GCD 使用过程中的出现的死锁问题

作者: Laughingg | 来源:发表于2016-06-23 22:27 被阅读36次

死锁 1、 主队列在主线程同步执行

下列代码写在 viewDidLoad 中:

NSLog(@"before: %@", [NSThread currentThread]);
// 创建一个队列(串行)
dispatch_queue_t q = dispatch_get_main_queue();

// 5 次异步
for (int index = 0; index < 5; index ++) {

    // 将任务添加到队列
    dispatch_sync(q, ^{
        NSLog(@"task : %@", [NSThread currentThread]);
    });
}

NSLog(@"after: %@", [NSThread currentThread]);

打印结果:
2016-06-21 12:07:22.921 Thread-Objc[44793:2467944] before: <NSThread: 0x7fb84a500ac0>{number = 1, name = main}

测试的结果是 : 死锁
关于死锁:记住主队列的特点就容易理解!主线程有任务就暂时不调度任务!

上面死锁的写法是: ** 主队列在主线程同步执行任务** 死锁。

死锁 2、

NSLog(@"before: %@", [NSThread currentThread]);

dispatch_queue_t q = dispatch_queue_create("q1", DISPATCH_QUEUE_SERIAL);

for (int index = 0; index < 10; index ++) {
    dispatch_async(q, ^{
        NSLog(@"async : %@", [NSThread currentThread]);
        
        dispatch_sync(q, ^{
            NSLog(@"sync :%@", [NSThread currentThread]);
        });
    });
}

NSLog(@"after: %@", [NSThread currentThread]);

打印结果: 
2016-06-23 22:24:46.583 Thread-Objc[14719:2440315] before: <NSThread: 0x7fd989701580>{number = 1, name = main}
2016-06-23 22:24:46.583 Thread-Objc[14719:2440315] after: <NSThread: 0x7fd989701580>{number = 1, name = main}
2016-06-23 22:24:46.584 Thread-Objc[14719:2440510] async :<NSThread: 0x7fd98971c4b0>{number = 2, name = (null)}

上面死锁的写法是: 串行队列异步执行,根据特点会开 1 条线程,然后再在当前队列线程进行同步执行 死锁。

死锁的共同特点是: 在当前队列的当前线程执行同步任务, 死锁

在 dispatch_sync 函数的 AIP 中有这么一段解释:

  • Calls to dispatch_sync() targeting the current queue will result
  • in dead-lock. Use of dispatch_sync() is also subject to the same
  • multi-party dead-lock problems that may result from the use of a mutex.
  • Use of dispatch_async() is preferred.
  • 在当前队列调用 dispatch_sync() 会造成死锁。
  • 在互斥锁里面使用 dispatch_sync() 也会造成同样的问题。
  • 优先考虑使用 dispatch_async()

相关文章

  • GCD 使用过程中的出现的死锁问题

    死锁 1、 主队列在主线程同步执行 下列代码写在 viewDidLoad 中: 上面死锁的写法是: ** 主队列...

  • GCD避免死锁的三要素

    平时总在用GCD,但你知不知道,GCD一不小心就会出现死锁,如果死锁在主线程上,整个程序就完了,所以避免死锁是我们...

  • 说说GCD中的死锁

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

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

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

  • 解决EXC_BREAKPOINT code 1的一种思路

    当我使用gcd解决变量的线程安全问题时,会出现标题中的错误。逛stackoverflow找到了思路,那就是队列死锁...

  • 2021--- GCD

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

  • 2022-11-17 08多线程

    GCD 同步串行 死锁!,会导致队列引起循环等待 没有问题 同步并发 答案:12345 产生死锁 异步串行 异步并...

  • iOS GCD死锁问题

    Queue (队列): 分为串行和并行, 串行队列按顺序开始执行, 执行完上一个才能执行下一个. 并行队列(开始也...

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

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

  • GCD 死锁

    GCD死锁 同步 异步 串行 并发

网友评论

      本文标题:GCD 使用过程中的出现的死锁问题

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