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. In all other cases, the default target queue will be returned. See
163 function never returns.
166 .Fn dispatch_set_target_queue
167 function updates the target queue of the given dispatch object. The target
168 queue of an object is responsible for processing the object.
170 The new target queue is retained by the given object before the previous target
171 queue is released. The new target queue setting will take effect between block
172 executions on the object, but not in the middle of any existing block executions
175 The default target queue of all dispatch objects created by the application is
176 the default priority global concurrent queue. To reset an object's target queue
177 to the default, pass the
178 .Dv DISPATCH_TARGET_QUEUE_DEFAULT
180 .Fn dispatch_set_target_queue .
182 The priority of a dispatch queue is inherited from its target queue.
183 In order to change the priority of a queue created with
184 .Fn dispatch_queue_create ,
186 .Fn dispatch_get_global_queue
187 function to obtain a target queue of the desired priority.
189 Blocks submitted to a serial queue whose target queue is another serial queue
190 will not be invoked concurrently with blocks submitted to the target queue or
191 to any other queue with that same target queue.
193 The target queue of a dispatch source specifies where its event handler and
194 cancellation handler blocks will be submitted. See
195 .Xr dispatch_source_create 3
196 for more information about dispatch sources.
198 The target queue of a dispatch I/O channel specifies the priority of the global
199 queue where its I/O operations are executed. See
200 .Xr dispatch_io_create 3
201 for more information about dispatch I/O channels.
203 For all other dispatch object types, the only function of the target queue is
204 to determine where an object's finalizer function is invoked.
206 The result of passing the main queue or a global concurrent queue as the first
208 .Fn dispatch_set_target_queue
211 Directly or indirectly setting the target queue of a dispatch queue to itself is
215 .Fn dispatch_get_current_queue
216 function is only recommended for debugging and logging purposes. Code must not
217 make any assumptions about the queue returned, unless it is one of the global
218 queues or a queue the code has itself created. The returned queue may have
219 arbitrary policies that may surprise code that tries to schedule work with the
220 queue. The list of policies includes, but is not limited to, queue width (i.e.
221 serial vs. concurrent), scheduling priority, security credential or filesystem
224 It is equally unsafe for code to assume that synchronous execution onto a queue
225 is safe from deadlock if that queue is not the one returned by
226 .Fn dispatch_get_current_queue .
229 .Fn dispatch_get_main_queue
230 may or may not equal the result of
231 .Fn dispatch_get_current_queue
232 when called on the main thread. Comparing the two is not a valid way to test
233 whether code is executing on the main thread. Foundation/AppKit programs should
234 use [NSThread isMainThread]. POSIX programs may use
235 .Xr pthread_main_np 3 .
237 Cocoa applications need not call
239 Blocks submitted to the main queue will be executed as part of the "common
240 modes" of the application's main NSRunLoop or CFRunLoop.
241 However, blocks submitted to the main queue in applications using
243 are not guaranteed to execute on the main thread.
245 The dispatch framework is a pure C level API. As a result, it does not catch
246 exceptions generated by higher level languages such as Objective-C or C++.
249 catch all exceptions before returning from a block submitted to a dispatch
250 queue; otherwise the process will be terminated with an uncaught exception.
252 The dispatch framework manages the relationship between dispatch queues and
253 threads of execution. As a result, applications
255 delete or mutate objects that they did not create. The following interfaces
257 be called by blocks submitted to a dispatch queue:
258 .Bl -bullet -offset indent
273 call the following interfaces from a block submitted to a dispatch queue if
274 and only if they restore the thread to its original state before returning:
275 .Bl -bullet -offset indent
277 .Fn pthread_setcancelstate
279 .Fn pthread_setcanceltype
281 .Fn pthread_setschedparam
285 .Fn pthread_setugid_np
294 rely on the following interfaces returning predictable results between
295 invocations of blocks submitted to a dispatch queue:
296 .Bl -bullet -offset indent
300 .Fn pthread_getschedparam
302 .Fn pthread_get_stacksize_np
304 .Fn pthread_get_stackaddr_np
306 .Fn pthread_mach_thread_np
308 .Fn pthread_from_mach_thread_np
313 may change between invocations of blocks, the value will not change during the
314 execution of any single block. Because the underlying thread may change beteween
315 block invocations on a single queue, using per-thread data as an out-of-band
316 return value is error prone. In other words, the result of calling
317 .Fn pthread_setspecific
319 .Fn pthread_getspecific
320 is well defined within a signle block, but not across multiple blocks. Also,
321 one cannot make any assumptions about when the destructor passed to
322 .Fn pthread_key_create
323 is called. The destructor may be called between the invocation of blocks on
324 the same queue, or during the idle state of a process.
326 The following example code correctly handles per-thread return values:
327 .Bd -literal -offset indent
330 dispatch_sync(queue, ^{
332 // Copy the per-thread return value to the callee thread
335 printf("kill(1,0) returned %d and errno %d\n", r, e);
338 Note that in the above example
340 is a per-thread variable and must be copied out explicitly as the block may be
341 invoked on different thread of execution than the caller. Another example of
342 per-thread data that would need to be copied is the use of
349 invokes the block on the current thread when possible. In this case, the thread
350 specific data such as
352 may persist from the block until back to the caller. Great care should be taken
353 not to accidentally rely on this side-effect.
357 .Xr dispatch_async 3 ,
358 .Xr dispatch_object 3 ,
359 .Xr dispatch_source_create 3