【发布时间】:2021-05-10 21:23:22
【问题描述】:
我试图了解DispatchQueues 的真正工作原理,我想知道假设DispatchQueues 有自己的管理线程是否安全?例如,让我们以串行队列为例。在我的理解中——因为它是串行的,新任务只能在当前任务结束后启动,所以“某人”必须从队列中取出新任务并提交执行!因此,基本上,队列似乎必须留在自己的线程中,该线程将调度存储在队列中的任务。这是正确的还是我误解了什么?
【问题讨论】:
-
Gcd 被嵌入内核。因此,它在您可以认为是线程的任何事物之外进行控制。它在基本的底层世界中受到控制,线程在其中生活、移动和存在。
-
@matt 所以,如果我正确理解了你的观点,那么下一个任务将由内核直接出列并调度。简而言之,通过某种本质(基本上是 Grand Central Dispatch),它是内核的一部分,它管理所有队列并能够在当前任务完成后直接将下一个任务出列并提交执行?我猜对了吗?
-
我是这么理解的。这就是 GCD 如此高效的原因。你正在寻找一种“上帝”,他的工作是让 GCD 队列/线程做他们所做的事情。那是内核;它负责线程,所以它本身不能说是in线程。它只是“是”,一直都是。
-
可以看一下源码:github.com/apple/swift-corelibs-libdispatch。 Swift GCD 包装了调用内核函数的 c 级 libdispatch。您应该在脑海中将线程与队列分开,队列是指工作的顺序,GCD 会在线程上适当地执行工作。如果需要更多线程,则系统将创建更多线程。源代码中有很多 cmets 解释了其中的一些。您可以让所有串行/并发队列使用同一个线程,但 GCD 会在可用时管理创建更多线程并根据需要提高效率。
-
这种“管理线程”的概念实际上没有意义(也没有关系)。应用程序开发人员的突出问题是 GCD 有工作线程池,当我们将代码分派到队列时,GCD 将控制 (a) 何时以及 (b) 代码将在哪个工作线程上运行。 (这就是 GCD 如何通过幼稚的
Thread实现获得性能提升:它最大限度地减少了新线程旋转的高成本开销,并简单地利用了现有的工作线程池。)你真的在问 GCD 内部是如何工作的吗?或者您只是想知道您分派的代码在哪个线程上运行?
标签: swift grand-central-dispatch dispatch-queue