1 .\" Copyright (c) 2008-2010 Apple Inc. All rights reserved.
3 .Dt dispatch_queue_create 3
6 .Nm dispatch_queue_create ,
7 .Nm dispatch_queue_get_label ,
8 .Nm dispatch_get_current_queue ,
9 .Nm dispatch_get_global_queue ,
10 .Nm dispatch_get_main_queue ,
12 .Nm dispatch_set_target_queue
13 .Nd where blocks are scheduled for execution
15 .Fd #include <dispatch/dispatch.h>
17 .Fo dispatch_queue_create
18 .Fa "const char *label" "dispatch_queue_attr_t attr"
21 .Fo dispatch_queue_get_label
22 .Fa "dispatch_queue_t queue"
25 .Fo dispatch_get_current_queue
29 .Fo dispatch_get_global_queue
31 .Fa "unsigned long flags"
34 .Fo dispatch_get_main_queue
42 .Fo dispatch_set_target_queue
43 .Fa "dispatch_object_t object"
44 .Fa "dispatch_queue_t target"
47 Queues are the fundamental mechanism for scheduling blocks for execution within
52 All blocks submitted to dispatch queues are dequeued in FIFO order.
53 By default, queues created with
54 .Fn dispatch_queue_create
55 wait for the previously dequeued block to complete before dequeuing the next
56 block. This FIFO completion behavior is sometimes simply described as a "serial
57 queue." All memory writes performed by a block dispatched to a serial queue are
58 guaranteed to be visible to subsequent blocks dispatched to the same queue.
59 Queues are not bound to any specific thread of execution and blocks submitted
60 to independent queues may execute concurrently. Queues, like all dispatch
61 objects, are reference counted and newly created queues have a reference count
66 argument is used to describe the purpose of the queue and is useful during
67 debugging and performance analysis. By convention, clients should pass a
68 reverse DNS style label.
69 If a label is provided, it is copied. If a label is not provided, then
70 .Fn dispatch_queue_get_label
71 returns an empty C string.
75 my_queue = dispatch_queue_create("com.example.subsystem.taskXYZ", NULL);
80 argument is reserved for future use and must be NULL.
82 Queues may be temporarily suspended and resumed with the functions
86 respectively. Suspension is checked prior to block execution and is
90 The dispatch framework provides a default serial queue for the application to
91 use. This queue is accessed via
92 .Fn dispatch_get_main_queue .
97 in order to process blocks submitted to the main queue. (See the compatibility
98 section for exceptions.)
99 .Sh GLOBAL CONCURRENT QUEUES
100 Unlike the main queue or queues allocated with
101 .Fn dispatch_queue_create ,
102 the global concurrent queues schedule blocks as soon as threads become
103 available (non-FIFO completion order). Four global concurrent queues are
104 provided, representing the following priority bands:
105 .Bl -bullet -compact -offset indent
107 DISPATCH_QUEUE_PRIORITY_HIGH
109 DISPATCH_QUEUE_PRIORITY_DEFAULT
111 DISPATCH_QUEUE_PRIORITY_LOW
113 DISPATCH_QUEUE_PRIORITY_BACKGROUND
116 The priority of a global concurrent queue controls the scheduling priority of
117 the threads created by the system to invoke the blocks submitted to that queue.
118 Global queues with lower priority will be scheduled for execution after all
119 global queues with higher priority have been scheduled. Additionally, items on
120 the background priority global queue will execute on threads with background
121 state as described in
123 (i.e.\& disk I/O is throttled and the thread's scheduling priority is set to
127 .Fn dispatch_get_global_queue
128 function to obtain the global queue of given priority. The
130 argument is reserved for future use and must be zero. Passing any value other
131 than zero may result in a NULL return value.
135 .Fn dispatch_queue_create
136 function returns NULL on failure.
139 .Fn dispatch_queue_get_label
140 function always returns a valid C string. An empty C string is returned if the
142 was NULL creation time.
145 .Fn dispatch_get_main_queue
146 function returns the default main queue.
149 .Fn dispatch_get_current_queue
150 function always returns a valid queue. When called from within a block
151 submitted to a dispatch queue, that queue will be returned. If this function is
152 called from the main thread before
154 is called, then the result of
155 .Fn dispatch_get_main_queue
156 is returned. The result of
157 .Fo dispatch_get_global_queue
158 .Fa DISPATCH_QUEUE_PRIORITY_DEFAULT
161 will be returned in all other cases.
165 function never returns.
168 .Fn dispatch_set_target_queue
169 function updates the target queue of the given dispatch object. The target
170 queue of an object is responsible for processing the object.
172 The new target queue is retained by the given object before the previous target
173 queue is released. The new target queue setting will take effect between block
174 executions on the object, but not in the middle of any existing block executions
177 The default target queue of all dispatch objects created by the application is
178 the default priority global concurrent queue. To reset an object's target queue
179 to the default, pass the
180 .Dv DISPATCH_TARGET_QUEUE_DEFAULT
182 .Fn dispatch_set_target_queue .
184 The priority of a dispatch queue is inherited from its target queue.
185 In order to change the priority of a queue created with
186 .Fn dispatch_queue_create ,
188 .Fn dispatch_get_global_queue
189 function to obtain a target queue of the desired priority.
191 Blocks submitted to a serial queue whose target queue is another serial queue
192 will not be invoked concurrently with blocks submitted to the target queue or
193 to any other queue with that same target queue.
195 The target queue of a dispatch source specifies where its event handler and
196 cancellation handler blocks will be submitted. See
197 .Xr dispatch_source_create 3
198 for more information about dispatch sources.
200 The target queue of a dispatch I/O channel specifies the priority of the global
201 queue where its I/O operations are executed. See
202 .Xr dispatch_io_create 3
203 for more information about dispatch I/O channels.
205 For all other dispatch object types, the only function of the target queue is
206 to determine where an object's finalizer function is invoked.
208 The result of passing the main queue or a global concurrent queue as the first
210 .Fn dispatch_set_target_queue
213 Directly or indirectly setting the target queue of a dispatch queue to itself is
217 .Fn dispatch_get_current_queue
218 function is only recommended for debugging and logging purposes. Code must not
219 make any assumptions about the queue returned, unless it is one of the global
220 queues or a queue the code has itself created. The returned queue may have
221 arbitrary policies that may surprise code that tries to schedule work with the
222 queue. The list of policies includes, but is not limited to, queue width (i.e.
223 serial vs. concurrent), scheduling priority, security credential or filesystem
226 It is equally unsafe for code to assume that synchronous execution onto a queue
227 is safe from deadlock if that queue is not the one returned by
228 .Fn dispatch_get_current_queue .
230 Cocoa applications need not call
232 Blocks submitted to the main queue will be executed as part of the "common
233 modes" of the application's main NSRunLoop or CFRunLoop.
234 However, blocks submitted to the main queue in applications using
236 are not guaranteed to execute on the main thread.
238 The dispatch framework is a pure C level API. As a result, it does not catch
239 exceptions generated by higher level languages such as Objective-C or C++.
242 catch all exceptions before returning from a block submitted to a dispatch
243 queue; otherwise the internal data structures of the dispatch framework will be
244 left in an inconsistent state.
246 The dispatch framework manages the relationship between dispatch queues and
247 threads of execution. As a result, applications
249 delete or mutate objects that they did not create. The following interfaces
251 be called by blocks submitted to a dispatch queue:
252 .Bl -bullet -offset indent
267 call the following interfaces from a block submitted to a dispatch queue if
268 and only if they restore the thread to its original state before returning:
269 .Bl -bullet -offset indent
271 .Fn pthread_setcancelstate
273 .Fn pthread_setcanceltype
275 .Fn pthread_setschedparam
279 .Fn pthread_setugid_np
288 rely on the following interfaces returning predictable results between
289 invocations of blocks submitted to a dispatch queue:
290 .Bl -bullet -offset indent
294 .Fn pthread_getschedparam
296 .Fn pthread_get_stacksize_np
298 .Fn pthread_get_stackaddr_np
300 .Fn pthread_mach_thread_np
302 .Fn pthread_from_mach_thread_np
307 may change between invocations of blocks, the value will not change during the
308 execution of any single block. Because the underlying thread may change beteween
309 block invocations on a single queue, using per-thread data as an out-of-band
310 return value is error prone. In other words, the result of calling
311 .Fn pthread_setspecific
313 .Fn pthread_getspecific
314 is well defined within a signle block, but not across multiple blocks. Also,
315 one cannot make any assumptions about when the destructor passed to
316 .Fn pthread_key_create
317 is called. The destructor may be called between the invocation of blocks on
318 the same queue, or during the idle state of a process.
320 The following example code correctly handles per-thread return values:
321 .Bd -literal -offset indent
324 dispatch_sync(queue, ^{
326 // Copy the per-thread return value to the callee thread
329 printf("kill(1,0) returned %d and errno %d\n", r, e);
332 Note that in the above example
334 is a per-thread variable and must be copied out explicitly as the block may be
335 invoked on different thread of execution than the caller. Another example of
336 per-thread data that would need to be copied is the use of
343 invokes the block on the current thread when possible. In this case, the thread
344 specific data such as
346 may persist from the block until back to the caller. Great care should be taken
347 not to accidentally rely on this side-effect.
351 .Xr dispatch_async 3 ,
352 .Xr dispatch_object 3 ,
353 .Xr dispatch_source_create 3