全局队列上 运行 和 dispatch_async 的块是否可以在主线程上执行?

Is it possible for a block run with dispatch_async on a global queue to execute on the main thread?

如果我说主线程有时会忙于某些 global_queue 任务?

例如。我有一些任务要执行,我使用以下语句之一:

    dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
      // task 1
    }

// or

    dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)) {
      // task 2
    }

是否有可能不小心在主线程上获得了这个任务?或者这是不可能的,因为主线程被锁定为全局队列? 谢谢!

实际上,这不应该发生,但是当您通过指定 QOS class 获取队列时,严格来说,您获取的队列是一个实现细节,您不应该依赖它作为一个特定的队列(或不是一个特定的队列)。此外,任何给定队列使用哪些线程来满足排队的工作是也是一个实现细节。

但实际上,不,我不希望看到 QOS_CLASS_BACKGROUNDQOS_CLASS_UTILITY 排队的工作在主线程上执行。

如果你想说服自己,你可以检查队列是否从 dispatch_get_global_queue(QOS_CLASS_UTILITY, 0) == dispatch_get_main_queue() 返回,同样,在你的工作单元内,你可以检查 [NSThread isMainThread] 看你是否在 main 上执行线程。

如果您在全局队列上调度,它将运行在全局队列上调度。如果你调度到主队列,它会在主队列上 运行。如果您调度到您自己创建的队列,它将 运行 在该队列上。

你问了"But if main thread is idle it can take task from global_queue"。不,那将完全没有抓住要点。如果主队列空闲,那么所有 CPU 都可用于 运行 后台任务,因此您的后台线程 运行 会快一点。主队列从另一个队列中获取任务是没有意义和错误的。