]> git.saurik.com Git - apple/libdispatch.git/blob - man/dispatch_queue_create.3
libdispatch-187.9.tar.gz
[apple/libdispatch.git] / man / dispatch_queue_create.3
1 .\" Copyright (c) 2008-2010 Apple Inc. All rights reserved.
2 .Dd May 1, 2008
3 .Dt dispatch_queue_create 3
4 .Os Darwin
5 .Sh NAME
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 ,
11 .Nm dispatch_main ,
12 .Nm dispatch_set_target_queue
13 .Nd where blocks are scheduled for execution
14 .Sh SYNOPSIS
15 .Fd #include <dispatch/dispatch.h>
16 .Ft dispatch_queue_t
17 .Fo dispatch_queue_create
18 .Fa "const char *label" "dispatch_queue_attr_t attr"
19 .Fc
20 .Ft "const char *"
21 .Fo dispatch_queue_get_label
22 .Fa "dispatch_queue_t queue"
23 .Fc
24 .Ft dispatch_queue_t
25 .Fo dispatch_get_current_queue
26 .Fa void
27 .Fc
28 .Ft dispatch_queue_t
29 .Fo dispatch_get_global_queue
30 .Fa "long priority"
31 .Fa "unsigned long flags"
32 .Fc
33 .Ft dispatch_queue_t
34 .Fo dispatch_get_main_queue
35 .Fa void
36 .Fc
37 .Ft void
38 .Fo dispatch_main
39 .Fa void
40 .Fc
41 .Ft void
42 .Fo dispatch_set_target_queue
43 .Fa "dispatch_object_t object"
44 .Fa "dispatch_queue_t target"
45 .Fc
46 .Sh DESCRIPTION
47 Queues are the fundamental mechanism for scheduling blocks for execution within
48 the
49 .Xr dispatch 3
50 framework.
51 .Pp
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
62 of one.
63 .Pp
64 The optional
65 .Fa label
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.
72 For example:
73 .Pp
74 .Bd -literal
75 my_queue = dispatch_queue_create("com.example.subsystem.taskXYZ", NULL);
76 .Ed
77 .Pp
78 The
79 .Fa attr
80 argument is reserved for future use and must be NULL.
81 .Pp
82 Queues may be temporarily suspended and resumed with the functions
83 .Fn dispatch_suspend
84 and
85 .Fn dispatch_resume
86 respectively. Suspension is checked prior to block execution and is
87 .Em not
88 preemptive.
89 .Sh MAIN QUEUE
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 .
93 Programs must call
94 .Fn dispatch_main
95 at the end of
96 .Fn main
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
106 .It
107 DISPATCH_QUEUE_PRIORITY_HIGH
108 .It
109 DISPATCH_QUEUE_PRIORITY_DEFAULT
110 .It
111 DISPATCH_QUEUE_PRIORITY_LOW
112 .It
113 DISPATCH_QUEUE_PRIORITY_BACKGROUND
114 .El
115 .Pp
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
122 .Xr setpriority 2
123 (i.e.\& disk I/O is throttled and the thread's scheduling priority is set to
124 lowest value).
125 .Pp
126 Use the
127 .Fn dispatch_get_global_queue
128 function to obtain the global queue of given priority. The
129 .Fa flags
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.
132 .Pp
133 .Sh RETURN VALUES
134 The
135 .Fn dispatch_queue_create
136 function returns NULL on failure.
137 .Pp
138 The
139 .Fn dispatch_queue_get_label
140 function always returns a valid C string. An empty C string is returned if the
141 .Fa label
142 was NULL creation time.
143 .Pp
144 The
145 .Fn dispatch_get_main_queue
146 function returns the default main queue.
147 .Pp
148 The
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
153 .Fn dispatch_main
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
159 .Fa 0
160 .Fc
161 will be returned in all other cases.
162 .Pp
163 The
164 .Fn dispatch_main
165 function never returns.
166 .Sh TARGET QUEUE
167 The
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.
171 .Pp
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
175 (non-preemptive).
176 .Pp
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
181 constant to
182 .Fn dispatch_set_target_queue .
183 .Pp
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 ,
187 use the
188 .Fn dispatch_get_global_queue
189 function to obtain a target queue of the desired priority.
190 .Pp
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.
194 .Pp
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.
199 .Pp
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.
204 .Pp
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.
207 .Pp
208 The result of passing the main queue or a global concurrent queue as the first
209 argument of
210 .Fn dispatch_set_target_queue
211 is undefined.
212 .Pp
213 Directly or indirectly setting the target queue of a dispatch queue to itself is
214 undefined.
215 .Sh CAVEATS
216 The
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
224 configuration.
225 .Pp
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 .
229 .Sh COMPATIBILITY
230 Cocoa applications need not call
231 .Fn dispatch_main .
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
235 .Fn dispatch_main
236 are not guaranteed to execute on the main thread.
237 .Pp
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++.
240 Applications
241 .Em MUST
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.
245 .Pp
246 The dispatch framework manages the relationship between dispatch queues and
247 threads of execution. As a result, applications
248 .Em MUST NOT
249 delete or mutate objects that they did not create. The following interfaces
250 .Em MUST NOT
251 be called by blocks submitted to a dispatch queue:
252 .Bl -bullet -offset indent
253 .It
254 .Fn pthread_cancel
255 .It
256 .Fn pthread_detach
257 .It
258 .Fn pthread_join
259 .It
260 .Fn pthread_kill
261 .It
262 .Fn pthread_exit
263 .El
264 .Pp
265 Applications
266 .Em MAY
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
270 .It
271 .Fn pthread_setcancelstate
272 .It
273 .Fn pthread_setcanceltype
274 .It
275 .Fn pthread_setschedparam
276 .It
277 .Fn pthread_sigmask
278 .It
279 .Fn pthread_setugid_np
280 .It
281 .Fn pthread_chdir
282 .It
283 .Fn pthread_fchdir
284 .El
285 .Pp
286 Applications
287 .Em MUST NOT
288 rely on the following interfaces returning predictable results between
289 invocations of blocks submitted to a dispatch queue:
290 .Bl -bullet -offset indent
291 .It
292 .Fn pthread_self
293 .It
294 .Fn pthread_getschedparam
295 .It
296 .Fn pthread_get_stacksize_np
297 .It
298 .Fn pthread_get_stackaddr_np
299 .It
300 .Fn pthread_mach_thread_np
301 .It
302 .Fn pthread_from_mach_thread_np
303 .El
304 .Pp
305 While the result of
306 .Fn pthread_self
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
312 and
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.
319 .Pp
320 The following example code correctly handles per-thread return values:
321 .Bd -literal -offset indent
322 __block int r;
323 __block int e;
324 dispatch_sync(queue, ^{
325 r = kill(1, 0);
326 // Copy the per-thread return value to the callee thread
327 e = errno;
328 });
329 printf("kill(1,0) returned %d and errno %d\n", r, e);
330 .Ed
331 .Pp
332 Note that in the above example
333 .Va errno
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
337 .Fn getpwnam
338 instead of
339 .Fn getpwnam_r .
340 .Pp
341 As an optimization,
342 .Fn dispatch_sync
343 invokes the block on the current thread when possible. In this case, the thread
344 specific data such as
345 .Va errno
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.
348 .Pp
349 .Sh SEE ALSO
350 .Xr dispatch 3 ,
351 .Xr dispatch_async 3 ,
352 .Xr dispatch_object 3 ,
353 .Xr dispatch_source_create 3