为 dispatch_queue_attr_t 传递什么

What to pass in for dispatch_queue_attr_t

我一直在阅读有关 Grand Central Dispatch 的各种教程。由于示例倾向于使用 null 作为第二个创建参数,即:

dispatch_queue_t myQueue = dispatch_queue_create(com.something.myqueue, NULL)

我很难理解第二个参数的用途。根据示例,它通常只是 null 吗?在 http://jeffreysambells.com/2013/03/01/asynchronous-operations-in-ios-with-grand-central-dispatch?

第二个参数指定您想要的队列类型:串行或并发。

如果你要求一个串行队列,那么提交到队列的块将按照它们提交的顺序执行,一次一个。

如果您要求并发队列,那么块可能(也可能不会!)在队列中的不同线程上同时执行。

您会在定义中看到 NULL 表示串行。这是 queue.h 的定义:

/*!
 * @typedef dispatch_queue_attr_t
 *
 * @abstract
 * Attribute for dispatch queues.
 */
DISPATCH_DECL(dispatch_queue_attr);

/*!
 * @const DISPATCH_QUEUE_SERIAL
 * @discussion A dispatch queue that invokes blocks serially in FIFO order.
 */
#define DISPATCH_QUEUE_SERIAL NULL

/*!
 * @const DISPATCH_QUEUE_CONCURRENT
 * @discussion A dispatch queue that may invoke blocks concurrently and supports
 * barrier blocks submitted with the dispatch barrier API.
 */
#define DISPATCH_QUEUE_CONCURRENT \
        DISPATCH_GLOBAL_OBJECT(dispatch_queue_attr_t, \
        _dispatch_queue_attr_concurrent)
__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_3)
DISPATCH_EXPORT
struct dispatch_queue_attr_s _dispatch_queue_attr_concurrent;

因此,您要传递的内容在很大程度上取决于您正在做的事情以及您正在做的事情是否可并行化。