DISPATCH_QUEUE_CONCURRENT和全局并发调度队列之间有什么区别

时间:2015-05-14 10:21:03

标签: ios multithreading grand-central-dispatch

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

E.x。

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, ^{ });

我在屏障上读到了一些东西,但不确定它与这两者有什么关系。有人可以解释这两个用例吗?

2 个答案:

答案 0 :(得分:4)

有四个全局并发队列,每个队列对应四个不同的优先级,每个队列始终存在,并且如果您需要它们,它们始终存在。因此,您不必创建并发队列以在后台执行某个块。 dispatch_get_global_queue()返回这四个队列中的一个。

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

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

答案 1 :(得分:2)

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

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

而且,正如我所说,大多数当时,全局队列都是你真正需要的。 (操作系统使它们“非常方便”,而为什么它们“真的很方便。”)通常,你“只在几个队列上放了很多信息”,一对一到读者和作者之间存在许多或多对多或多对一的关系。