美文网首页
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")
    }
    

    原理和上面的一样

    相关文章

      网友评论

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

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