gpt4 book ai didi

ios - 为什么 concurrentQueue.sync 不会导致死锁

转载 作者:行者123 更新时间:2023-12-01 18:04:39 26 4
gpt4 key购买 nike

此代码将死锁,因为:

  • 他们在同一个线程
  • print(2) 必须等待 print(3)
  • print(3) 必须等待 print(2)

  • 例如:
    DispatchQueue.main.async {
    print(Thread.current)
    DispatchQueue.main.sync {
    print(Thread.current)
    print(2)
    }
    print(3)
    }

    为什么在 concurrentQueue不会造成死锁?他们也在同一个线程中。
    DispatchQueue.global().async {
    print(Thread.current)
    DispatchQueue.global().sync {
    print(Thread.current)
    print(2)
    }
    print(3)
    }

    最佳答案

    你问:

    Why in the concurrentQueue won't cause deadlock? They are also in same thread.


    不,它们必须在同一个线程中。它们在同一个队列中,但不一定是同一个线程。 (作为优化的一部分,见下文,它实际上可能最终在同一个线程上运行,但不一定如此。但从逻辑上讲,您应该将其视为在单独的线程上运行。)
    这就是“并发队列”背后的全部想法,它们可以在不同的线程上运行单独的调度任务。这就是它们允许并发操作的方式。并发队列上的一个分派(dispatch)任务可以在一个线程上运行,而同一队列上的另一个分派(dispatch)任务可以在单独的线程上运行。
    作为老 Concurrency Programming Guide在其对“并发队列”的定义中说:

    The currently executing tasks run on distinct threads that are managed by the dispatch queue.


    或者,如 DispatchQueue documentation says :

    DispatchQueue manages the execution of work items. Each work item submitted to a queue is processed on a pool of threads managed by the system. [emphasis added]



    让这更令人困惑的是有一个 GCD 优化,如果你是 dispatching synchronously ...

    As a performance optimization, this function executes blocks on the current thread whenever possible...


    因此,当从队列同步调度时,它实际上最终会在同一个线程上运行该代码(除非您是从后台队列调度到主队列)。考虑:
    let queue = DispatchQueue.global()
    let queue2 = DispatchQueue(label: "queue2")

    queue.async {
    print(1, Thread.current)
    queue2.sync {
    print(2, Thread.current)
    }
    print(3, Thread.current)
    }
    那一秒 print声明将表明,即使您有一个完全不同的队列,它也可能作为上述 sync 的一部分。优化,在当前线程上运行代码。如果那个内部 sync 也是如此电话是同一个 queue外部 block 被分派(dispatch)到的地方。
    现在看这个优化的结果,感觉就像是串行队列的场景,其实不然。串行队列一次只允许一个调度的任务运行,因此根据定义,尝试同步调度(阻塞当前线程直到调度的 block 运行)到它自己是死锁。
    但是并发队列分派(dispatch)给自己通常不会死锁。一个警告是工作线程的数量是相当有限的,所以如果你有“线程爆炸”(你可能有超过 64 个工作线程在运行),那么它可能会死锁,所以请确保将你的并发限制在合理的范围内值(value)。

    关于ios - 为什么 concurrentQueue.sync 不会导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53293965/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com