【问题标题】:what is the difference between DISPATCH_QUEUE_CONCURRENT and Global Concurrent Dispatch QueuesDISPATCH_QUEUE_CONCURRENT 和全局并发调度队列有什么区别
【发布时间】:2015-07-25 22:08:48
【问题描述】:

我在苹果文档中读到here ,为了创建并发队列,可以使用 DISPATCH_QUEUE_CONCURRENT 和全局并发调度队列,但是我不确定两者之间的区别是什么。

例如

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ });

dispatch_queue_t queue = dispatch_queue_create("custom",DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{ });

我读过一些关于障碍的东西,但不确定它是如何与这两者相关的。谁能解释一下这两个的用例吗?

【问题讨论】:

    标签: ios multithreading grand-central-dispatch


    【解决方案1】:

    有四个全局并发队列,一个用于四个不同优先级中的每一个,它们始终存在,并且在您需要时始终存在。因此,您不必创建并发队列即可在后台执行某些块。 dispatch_get_global_queue() 返回这四个队列之一。

    如果需要,您可以创建自己的队列并在不再需要时将其删除。

    您正在阅读有关障碍的内容:每个人都使用全局队列。在队列中使用 每个人 使用的屏障可以说是非常不礼貌的。这就是为什么你不应该在全局队列中使用障碍,只能在你自己创建的队列中使用。

    【讨论】:

    • 关于“障碍”的要点。它们肯定在全局队列中没有位置,因此,“任何你认为需要使用屏障、信号量等的情况”。可能是非全局队列的用例。如果您愿意,该队列是“特定于目的的”,您可以将一堆消息塞入队列中,并在它们之间设置一个屏障条目以将它们分开......并且该队列上的读取器/写入器都了解什么是继续 that 队列。 (全局队列可能是一个放置通知消息的地方:“嘿,伙计们,我刚刚在 queue-X 上放了一些东西。去看看吧。”)
    【解决方案2】:

    在第一种情况下,您请求的是为您的应用程序提供的“全局队列”之一。 “任何人、任何地方、在您的应用程序中”只需向dispatch_get_global_queue() 询问即可轻松引用该队列。队列实际上是单例的。而且,几乎所有时间,这就是你所需要的。操作系统为您构建它们很有帮助,并使每个人(在您的应用程序中)都可以轻松访问它们。

    dispatch_queue_create() 用于在您真正需要“另一个队列”的极少数情况下。它像所有其他队列一样绑定到您的应用程序,但您自己管理它。您必须为应用程序的其他部分提供一些方法来获取该队列句柄。例如,如果在您的设计中真的需要将不同类型的请求放置到不同的队列中,您可能会这样做。

    而且,正如我所说,大多数时间,全局队列就是您真正需要的。 (操作系统使它们“非常方便”,这就是为什么它们“非常方便”。)通常,您“将大量消息放在几个队列中”,使用一对一读者和作者之间的多对多或多对一关系。

    【讨论】:

      猜你喜欢
      • 2012-03-25
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多