美文网首页
GCD 锁死简单案例

GCD 锁死简单案例

作者: 会飞的超大鱼 | 来源:发表于2023-05-16 11:33 被阅读0次

什么是 GCD 锁死问题

在向当前串行队列里面添加同步(sync)执行任务,会产生死锁卡住当前线程。

例如:在一个队列中,存在两个任务,分别是 A 和 B,然后 A 等待 B 执行完成,B 有等待 A 的完成,这样相互等待就造成了锁死,程序就会崩溃:Thread 3: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

案例一

print("执行了 任务 1")
DispatchQueue.main.sync {
    print("执行了 任务 2")
}
print("执行了 任务 3")

上面的代码在主线程队列中执行,任务2同步执行,这里就会线程阻塞,然后任务2加入到主线程队列任务3后面,这里任务3会等待任务2的结束,任务2又排在任务3 的后面等待任务3的完成,这样就造成了锁死。

队列示意图:

[任务1] <- (同步线程【执行任务2】) <- [任务3] <- [任务2]

DispatchQueue.main.sync 同步执行会将任务加到队列最后一个执行,也就是任务3后面

案例二

// 默认是串行队列,并行队列需要添加 attributes 参数 .concurrent
let queue = DispatchQueue(label: "queue.com");
print("初始任务")
queue.async {
    queue.sync {
         print("执行了 A")
    }
    queue.sync {
        print("执行了 B")
    }
    print("执行了 C")
}

原理和上面的一样

相关文章

  • iOS-知识点

    五个案例让你明白GCD死锁:http://ios.jobbole.com/82622/ iOS开发中多线程间关于锁...

  • iOS 多线程

    参考链接 iOS多线程iOS 多线程:『GCD』详尽总结iOS简单优雅的实现复杂情况下的串行需求(各种锁、GCD ...

  • GCD

    GCD 异步刷新屏幕在主队列中执行 dispatch_sync()锁死 在当前线程中调用dispatch_sync...

  • iOS中多线程之GCD应用

    GCD通过把计算密集型任务放于后台运行,以此提高APP的响应速度。 GCD提供了更简单的并发模型,它优于线程锁,并...

  • iOS多线程(二) - GCD

    前言 本系列文章列表 概述、NSThread GCD NSOperation 锁 GCD(Grand Centra...

  • 多线程

    ios中为我们提供了GCD、NSOpration、NSThread 一、GCD多线程与锁GCD 同步异步、串行、并...

  • 多线程

    GCD NSOperation NSThread 多线程与锁 一、GCD 同步、异步 和 串行、并发 dispat...

  • iOS开发中知道的哪些锁?

    一、自旋锁 A、OSLink 二、互斥锁 A. 递归锁 B. 条件锁 C.普通互斥锁 NSLock 三、GCD锁 ...

  • iOS简单优雅的实现复杂情况下的串行需求(各种锁、GCD 、NS

    iOS简单优雅的实现复杂情况下的串行需求(各种锁、GCD 、NSOperationQueue...) 昨天一个同事...

  • [iOS面试]第6章 多线程相关面试问题

    本文主讲多线程相关面试问题:包括GCD、NSOperation、NSThread、多线程与锁。 一、GCD 同步/...

网友评论

      本文标题:GCD 锁死简单案例

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