global_queue 和 qos_class_user_interactive

global_queue with qos_class_user_interactive

我试图理解 GCD 并编写了这段代码来找出 运行 优先级:

  override func viewDidLoad() {
    super.viewDidLoad()

    fetchImage()
    print(1)

    dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) {
      print(2)
    }

    dispatch_async(dispatch_get_main_queue()) {
      print(3)
    }
    dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)) { 
      print(5)
    }
  }

我在控制台中得到了下一个结果:

1

2

5

3

所以问题是:

第 1 部分:为什么 3 在 5 之后(main_queue 具有最高优先级?)

第 2 部分:为什么 2 也高于 3 和 5?

谢谢大家!

切记:这是多线程,在多核设备上,将输出写到一个你不知道线程安全和内部管理的日志...

也就是说:

  1. 1 是第一个,因为它是同步的
  2. 2 是第二个,因为它也是同步的
  3. 3 不是下一个,因为它被推入主线程 运行 循环中等待 运行 的事物队列中,而您不知道该队列中已经有什么其他东西
  4. 5 在 3 之前,因为它(基本上)具有相同的优先级,但它 运行 在一个可能没有其他等待的队列上(QOS_CLASS_USER_INTERACTIVE ~= 主线程优先级)

注意,我说 ~= 是因为我没有检查确切的值,虽然我希望优先级值匹配,但它可能略有不同,否则 'interactive' 意义不大...