Ios 如果在并发队列中导致死锁,会发生什么情况?

Ios 如果在并发队列中导致死锁,会发生什么情况?,ios,multithreading,grand-central-dispatch,Ios,Multithreading,Grand Central Dispatch,我在苹果文档中读到: 重要提示:决不能从计划传递给函数的同一队列中执行的任务调用dispatch_sync或dispatch_sync函数。这对于保证死锁的串行队列尤其重要,但对于并发队列也应该避免 第一种情况会导致崩溃,但第二种情况不会,应用程序可以工作。在由并发队列执行的任务中,调用sync时到底发生了什么 let concurrentQueue = DispatchQueue(label: "queue2.concurrent", attributes: .concurrent)

我在苹果文档中读到:

重要提示:决不能从计划传递给函数的同一队列中执行的任务调用dispatch_sync或dispatch_sync函数。这对于保证死锁的串行队列尤其重要,但对于并发队列也应该避免

第一种情况会导致崩溃,但第二种情况不会,应用程序可以工作。在由并发队列执行的任务中,调用sync时到底发生了什么

let concurrentQueue = DispatchQueue(label: "queue2.concurrent", attributes: .concurrent)

    for _ in 0..<10 {
        concurrentQueue.async {
            print(Thread.current)
            concurrentQueue.sync {
                print(Thread.current)
                print(2)
            }
        }
    }
让concurrentQueue=DispatchQueue(标签:“queue2.concurrent”,属性:。concurrent)

对于0..中的uuu,您提供的代码段不会导致死锁

for
循环将在队列中放置10个任务,然后执行将从代码段的底部开始。当资源允许时,队列将在GCD线程池中的线程上启动这些任务,如果可用CPU时间超过现有线程可以利用的时间,则可能会创建新线程。每个任务将打印其当前线程描述,然后同步提交内部任务

同步提交内部任务仅仅意味着在内部任务完成之前,外部任务不会继续(直到结束)

现在,理论上,队列可以在GCD池中的另一个线程上运行内部任务。然而,由于GCD知道调用线程被阻塞,它实际上会在调用线程上运行内部任务。因此,总是有一个线程可用,没有任何东西可以阻止内部任务立即启动

因此,如果内部任务只是内联到外部任务中,那么代码的行为非常类似:

for _ in 0..<10 {
    concurrentQueue.async {
        print(Thread.current)
        print(Thread.current)
        print(2)
    }
}

for uu0..您提供的代码段不会导致死锁

for
循环将在队列中放置10个任务,然后执行将从代码段的底部开始。当资源允许时,队列将在GCD线程池中的线程上启动这些任务,如果可用CPU时间超过现有线程可以利用的时间,则可能会创建新线程。每个任务将打印其当前线程描述,然后同步提交内部任务

同步提交内部任务仅仅意味着在内部任务完成之前,外部任务不会继续(直到结束)

现在,理论上,队列可以在GCD池中的另一个线程上运行内部任务。然而,由于GCD知道调用线程被阻塞,它实际上会在调用线程上运行内部任务。因此,总是有一个线程可用,没有任何东西可以阻止内部任务立即启动

因此,如果内部任务只是内联到外部任务中,那么代码的行为非常类似:

for _ in 0..<10 {
    concurrentQueue.async {
        print(Thread.current)
        print(Thread.current)
        print(2)
    }
}

for uu0..非常感谢您的解释,现在我看到了。谢谢@肯特非常感谢你的解释,现在我明白了。谢谢@知识范围