1 .\" Copyright (c) 2008-2012 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_global_queue
27 .Fa "unsigned long flags"
30 .Fo dispatch_get_main_queue
38 .Fo dispatch_set_target_queue
39 .Fa "dispatch_object_t object"
40 .Fa "dispatch_queue_t target"
43 Queues are the fundamental mechanism for scheduling blocks for execution within
48 All blocks submitted to dispatch queues are dequeued in FIFO order.
49 Queues created with the
50 .Dv DISPATCH_QUEUE_SERIAL
51 attribute wait for the previously dequeued block to complete before dequeuing
52 the next block. A queue with this FIFO completion behavior is usually simply
53 described as a "serial queue." All memory writes performed by a block dispatched
54 to a serial queue are guaranteed to be visible to subsequent blocks dispatched
55 to the same queue. Queues are not bound to any specific thread of execution and
56 blocks submitted to independent queues may execute concurrently.
58 Queues created with the
59 .Dv DISPATCH_QUEUE_CONCURRENT
60 attribute may execute dequeued blocks concurrently and support barrier blocks
61 submitted with the dispatch barrier API.
63 Queues are created with the
64 .Fn dispatch_queue_create
65 function. Queues, like all dispatch objects, are reference counted and newly
66 created queues have a reference count of one.
70 argument is used to describe the purpose of the queue and is useful during
71 debugging and performance analysis. If a label is provided, it is copied.
72 By convention, clients should pass a reverse DNS style label. For example:
74 .Bd -literal -offset indent
75 my_queue = dispatch_queue_create("com.example.subsystem.taskXYZ",
76 DISPATCH_QUEUE_SERIAL);
81 argument specifies the type of queue to create and must be either
82 .Dv DISPATCH_QUEUE_SERIAL
84 .Dv DISPATCH_QUEUE_CONCURRENT .
87 .Fn dispatch_queue_get_label
88 function returns the label provided when the given
90 was created (or an empty C string if no label was provided at creation).
92 .Dv DISPATCH_CURRENT_QUEUE_LABEL
94 .Fn dispatch_queue_get_label
95 returns the label of the current queue.
97 Queues may be temporarily suspended and resumed with the functions
101 respectively. Suspension is checked prior to block execution and is
105 The dispatch framework provides a default serial queue for the application to
106 use. This queue is accessed via the
107 .Fn dispatch_get_main_queue
114 in order to process blocks submitted to the main queue. (See the
116 section for exceptions.) The
118 function never returns.
119 .Sh GLOBAL CONCURRENT QUEUES
120 Unlike the main queue or queues allocated with
121 .Fn dispatch_queue_create ,
122 the global concurrent queues schedule blocks as soon as threads become
123 available (non-FIFO completion order). Four global concurrent queues are
124 provided, representing the following priority bands:
125 .Bl -bullet -compact -offset indent
127 DISPATCH_QUEUE_PRIORITY_HIGH
129 DISPATCH_QUEUE_PRIORITY_DEFAULT
131 DISPATCH_QUEUE_PRIORITY_LOW
133 DISPATCH_QUEUE_PRIORITY_BACKGROUND
136 The priority of a global concurrent queue controls the scheduling priority of
137 the threads created by the system to invoke the blocks submitted to that queue.
138 Global queues with lower priority will be scheduled for execution after all
139 global queues with higher priority have been scheduled. Additionally, items on
140 the background priority global queue will execute on threads with background
141 state as described in
143 (i.e.\& disk I/O is throttled and the thread's scheduling priority is set to
147 .Fn dispatch_get_global_queue
148 function to obtain the global queue of given priority. The
150 argument is reserved for future use and must be zero. Passing any value other
151 than zero may result in a NULL return value.
154 .Fn dispatch_set_target_queue
155 function updates the target queue of the given dispatch object. The target
156 queue of an object is responsible for processing the object.
158 The new target queue is retained by the given object before the previous target
159 queue is released. The new target queue setting will take effect between block
160 executions on the object, but not in the middle of any existing block executions
163 The default target queue of all dispatch objects created by the application is
164 the default priority global concurrent queue. To reset an object's target queue
165 to the default, pass the
166 .Dv DISPATCH_TARGET_QUEUE_DEFAULT
168 .Fn dispatch_set_target_queue .
170 The priority of a dispatch queue is inherited from its target queue.
171 In order to change the priority of a queue created with
172 .Fn dispatch_queue_create ,
174 .Fn dispatch_get_global_queue
175 function to obtain a target queue of the desired priority.
177 Blocks submitted to a serial queue whose target queue is another serial queue
178 will not be invoked concurrently with blocks submitted to the target queue or
179 to any other queue with that same target queue.
181 The target queue of a dispatch source specifies where its event handler and
182 cancellation handler blocks will be submitted. See
183 .Xr dispatch_source_create 3
184 for more information about dispatch sources.
186 The target queue of a dispatch I/O channel specifies the priority of the global
187 queue where its I/O operations are executed. See
188 .Xr dispatch_io_create 3
189 for more information about dispatch I/O channels.
191 For all other dispatch object types, the only function of the target queue is
192 to determine where an object's finalizer function is invoked.
194 The result of passing the main queue or a global concurrent queue as the first
196 .Fn dispatch_set_target_queue
199 Directly or indirectly setting the target queue of a dispatch queue to itself is
201 .Sh DEPRECATED FUNCTIONS
202 The following functions are deprecated and will be removed in a future release:
206 .Fn dispatch_get_current_queue void ;
209 .Fn dispatch_get_current_queue
210 always returns a valid queue. When called from within a block
211 submitted to a dispatch queue, that queue will be returned. If this function is
212 called from the main thread before
214 is called, then the result of
215 .Fn dispatch_get_main_queue
216 is returned. In all other cases, the default target queue will be returned.
219 .Fn dispatch_get_current_queue
220 is strongly discouraged except for debugging and logging purposes. Code must not
221 make any assumptions about the queue returned, unless it is one of the global
222 queues or a queue the code has itself created. The returned queue may have
223 arbitrary policies that may surprise code that tries to schedule work with the
224 queue. The list of policies includes, but is not limited to, queue width (i.e.
225 serial vs. concurrent), scheduling priority, security credential or filesystem
226 configuration. This function is deprecated and will be removed in a future
229 It is equally unsafe for code to assume that synchronous execution onto a queue
230 is safe from deadlock if that queue is not the one returned by
231 .Fn dispatch_get_current_queue .
234 .Fn dispatch_get_main_queue
235 may or may not equal the result of
236 .Fn dispatch_get_current_queue
237 when called on the main thread. Comparing the two is not a valid way to test
238 whether code is executing on the main thread. Foundation/AppKit programs should
239 use [NSThread isMainThread]. POSIX programs may use
240 .Xr pthread_main_np 3 .
242 .Fn dispatch_get_current_queue
243 may return a queue owned by a different subsystem which has already had all
244 external references to it released. While such a queue will continue to exist
245 until all blocks submitted to it have completed, attempting to retain it is
246 forbidden and will trigger an assertion. If Objective-C Automatic Reference
247 Counting is enabled, any use of the object returned by
248 .Fn dispatch_get_current_queue
249 will cause retain calls to be automatically generated, so the use of
250 .Fn dispatch_get_current_queue
251 for any reason in code built with ARC is particularly strongly discouraged.
253 Cocoa applications need not call
255 Blocks submitted to the main queue will be executed as part of the "common
256 modes" of the application's main NSRunLoop or CFRunLoop.
257 However, blocks submitted to the main queue in applications using
259 are not guaranteed to execute on the main thread.
261 The dispatch framework is a pure C level API. As a result, it does not catch
262 exceptions generated by higher level languages such as Objective-C or C++.
265 catch all exceptions before returning from a block submitted to a dispatch
266 queue; otherwise the process will be terminated with an uncaught exception.
268 The dispatch framework manages the relationship between dispatch queues and
269 threads of execution. As a result, applications
271 delete or mutate objects that they did not create. The following interfaces
273 be called by blocks submitted to a dispatch queue:
274 .Bl -bullet -offset indent
289 call the following interfaces from a block submitted to a dispatch queue if
290 and only if they restore the thread to its original state before returning:
291 .Bl -bullet -offset indent
293 .Fn pthread_setcancelstate
295 .Fn pthread_setcanceltype
297 .Fn pthread_setschedparam
301 .Fn pthread_setugid_np
306 rely on the following interfaces returning predictable results between
307 invocations of blocks submitted to a dispatch queue:
308 .Bl -bullet -offset indent
312 .Fn pthread_getschedparam
314 .Fn pthread_get_stacksize_np
316 .Fn pthread_get_stackaddr_np
318 .Fn pthread_mach_thread_np
320 .Fn pthread_from_mach_thread_np
325 may change between invocations of blocks, the value will not change during the
326 execution of any single block. Because the underlying thread may change beteween
327 block invocations on a single queue, using per-thread data as an out-of-band
328 return value is error prone. In other words, the result of calling
329 .Fn pthread_setspecific
331 .Fn pthread_getspecific
332 is well defined within a signle block, but not across multiple blocks. Also,
333 one cannot make any assumptions about when the destructor passed to
334 .Fn pthread_key_create
335 is called. The destructor may be called between the invocation of blocks on
336 the same queue, or during the idle state of a process.
338 The following example code correctly handles per-thread return values:
339 .Bd -literal -offset indent
342 dispatch_sync(queue, ^{
344 // Copy the per-thread return value to the callee thread
347 printf("kill(1,0) returned %d and errno %d\n", r, e);
350 Note that in the above example
352 is a per-thread variable and must be copied out explicitly as the block may be
353 invoked on different thread of execution than the caller. Another example of
354 per-thread data that would need to be copied is the use of
361 invokes the block on the current thread when possible. In this case, the thread
362 specific data such as
364 may persist from the block until back to the caller. Great care should be taken
365 not to accidentally rely on this side-effect.
369 .Xr dispatch_async 3 ,
370 .Xr dispatch_object 3 ,
371 .Xr dispatch_source_create 3