]> git.saurik.com Git - apple/libdispatch.git/blame_incremental - man/dispatch_queue_create.3
libdispatch-913.30.4.tar.gz
[apple/libdispatch.git] / man / dispatch_queue_create.3
... / ...
CommitLineData
1.\" Copyright (c) 2008-2012 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_global_queue
26.Fa "long priority"
27.Fa "unsigned long flags"
28.Fc
29.Ft dispatch_queue_t
30.Fo dispatch_get_main_queue
31.Fa void
32.Fc
33.Ft void
34.Fo dispatch_main
35.Fa void
36.Fc
37.Ft void
38.Fo dispatch_set_target_queue
39.Fa "dispatch_object_t object"
40.Fa "dispatch_queue_t target"
41.Fc
42.Sh DESCRIPTION
43Queues are the fundamental mechanism for scheduling blocks for execution within
44the
45.Xr dispatch 3
46framework.
47.Pp
48All blocks submitted to dispatch queues are dequeued in FIFO order.
49Queues created with the
50.Dv DISPATCH_QUEUE_SERIAL
51attribute wait for the previously dequeued block to complete before dequeuing
52the next block. A queue with this FIFO completion behavior is usually simply
53described as a "serial queue." All memory writes performed by a block dispatched
54to a serial queue are guaranteed to be visible to subsequent blocks dispatched
55to the same queue. Queues are not bound to any specific thread of execution and
56blocks submitted to independent queues may execute concurrently.
57.Pp
58Queues created with the
59.Dv DISPATCH_QUEUE_CONCURRENT
60attribute may execute dequeued blocks concurrently and support barrier blocks
61submitted with the dispatch barrier API.
62.Sh CREATION
63Queues are created with the
64.Fn dispatch_queue_create
65function. Queues, like all dispatch objects, are reference counted and newly
66created queues have a reference count of one.
67.Pp
68The optional
69.Fa label
70argument is used to describe the purpose of the queue and is useful during
71debugging and performance analysis. If a label is provided, it is copied.
72By convention, clients should pass a reverse DNS style label. For example:
73.Pp
74.Bd -literal -offset indent
75my_queue = dispatch_queue_create("com.example.subsystem.taskXYZ",
76 DISPATCH_QUEUE_SERIAL);
77.Ed
78.Pp
79The
80.Fa attr
81argument specifies the type of queue to create and must be either
82.Dv DISPATCH_QUEUE_SERIAL
83or
84.Dv DISPATCH_QUEUE_CONCURRENT .
85.Pp
86The
87.Fn dispatch_queue_get_label
88function returns the label provided when the given
89.Fa queue
90was created (or an empty C string if no label was provided at creation).
91Passing the constant
92.Dv DISPATCH_CURRENT_QUEUE_LABEL
93to
94.Fn dispatch_queue_get_label
95returns the label of the current queue.
96.Sh SUSPENSION
97Queues may be temporarily suspended and resumed with the functions
98.Fn dispatch_suspend
99and
100.Fn dispatch_resume
101respectively. Suspension is checked prior to block execution and is
102.Em not
103preemptive.
104.Sh MAIN QUEUE
105The dispatch framework provides a default serial queue for the application to
106use. This queue is accessed via the
107.Fn dispatch_get_main_queue
108function.
109.Pp
110Programs must call
111.Fn dispatch_main
112at the end of
113.Fn main
114in order to process blocks submitted to the main queue. (See the
115.Sx COMPATIBILITY
116section for exceptions.) The
117.Fn dispatch_main
118function never returns.
119.Sh GLOBAL CONCURRENT QUEUES
120Unlike the main queue or queues allocated with
121.Fn dispatch_queue_create ,
122the global concurrent queues schedule blocks as soon as threads become
123available (non-FIFO completion order). Four global concurrent queues are
124provided, representing the following priority bands:
125.Bl -bullet -compact -offset indent
126.It
127DISPATCH_QUEUE_PRIORITY_HIGH
128.It
129DISPATCH_QUEUE_PRIORITY_DEFAULT
130.It
131DISPATCH_QUEUE_PRIORITY_LOW
132.It
133DISPATCH_QUEUE_PRIORITY_BACKGROUND
134.El
135.Pp
136The priority of a global concurrent queue controls the scheduling priority of
137the threads created by the system to invoke the blocks submitted to that queue.
138Global queues with lower priority will be scheduled for execution after all
139global queues with higher priority have been scheduled. Additionally, items on
140the background priority global queue will execute on threads with background
141state as described in
142.Xr setpriority 2
143(i.e.\& disk I/O is throttled and the thread's scheduling priority is set to
144lowest value).
145.Pp
146Use the
147.Fn dispatch_get_global_queue
148function to obtain the global queue of given priority. The
149.Fa flags
150argument is reserved for future use and must be zero. Passing any value other
151than zero may result in a NULL return value.
152.Sh TARGET QUEUE
153The
154.Fn dispatch_set_target_queue
155function updates the target queue of the given dispatch object. The target
156queue of an object is responsible for processing the object.
157.Pp
158The new target queue is retained by the given object before the previous target
159queue is released. The new target queue setting will take effect between block
160executions on the object, but not in the middle of any existing block executions
161(non-preemptive).
162.Pp
163The default target queue of all dispatch objects created by the application is
164the default priority global concurrent queue. To reset an object's target queue
165to the default, pass the
166.Dv DISPATCH_TARGET_QUEUE_DEFAULT
167constant to
168.Fn dispatch_set_target_queue .
169.Pp
170The priority of a dispatch queue is inherited from its target queue.
171In order to change the priority of a queue created with
172.Fn dispatch_queue_create ,
173use the
174.Fn dispatch_get_global_queue
175function to obtain a target queue of the desired priority.
176.Pp
177Blocks submitted to a serial queue whose target queue is another serial queue
178will not be invoked concurrently with blocks submitted to the target queue or
179to any other queue with that same target queue.
180.Pp
181The target queue of a dispatch source specifies where its event handler and
182cancellation handler blocks will be submitted. See
183.Xr dispatch_source_create 3
184for more information about dispatch sources.
185.Pp
186The target queue of a dispatch I/O channel specifies the priority of the global
187queue where its I/O operations are executed. See
188.Xr dispatch_io_create 3
189for more information about dispatch I/O channels.
190.Pp
191For all other dispatch object types, the only function of the target queue is
192to determine where an object's finalizer function is invoked.
193.Pp
194The result of passing the main queue or a global concurrent queue as the first
195argument of
196.Fn dispatch_set_target_queue
197is undefined.
198.Pp
199Directly or indirectly setting the target queue of a dispatch queue to itself is
200undefined.
201.Sh DEPRECATED FUNCTIONS
202The following functions are deprecated and will be removed in a future release:
203.Bl -item
204.It
205.Ft dispatch_queue_t
206.Fn dispatch_get_current_queue void ;
207.El
208.Pp
209.Fn dispatch_get_current_queue
210always returns a valid queue. When called from within a block
211submitted to a dispatch queue, that queue will be returned. If this function is
212called from the main thread before
213.Fn dispatch_main
214is called, then the result of
215.Fn dispatch_get_main_queue
216is returned. In all other cases, the default target queue will be returned.
217.Pp
218The use of
219.Fn dispatch_get_current_queue
220is strongly discouraged except for debugging and logging purposes. Code must not
221make any assumptions about the queue returned, unless it is one of the global
222queues or a queue the code has itself created. The returned queue may have
223arbitrary policies that may surprise code that tries to schedule work with the
224queue. The list of policies includes, but is not limited to, queue width (i.e.
225serial vs. concurrent), scheduling priority, security credential or filesystem
226configuration. This function is deprecated and will be removed in a future
227release.
228.Pp
229It is equally unsafe for code to assume that synchronous execution onto a queue
230is safe from deadlock if that queue is not the one returned by
231.Fn dispatch_get_current_queue .
232.Pp
233The result of
234.Fn dispatch_get_main_queue
235may or may not equal the result of
236.Fn dispatch_get_current_queue
237when called on the main thread. Comparing the two is not a valid way to test
238whether code is executing on the main thread. Foundation/AppKit programs should
239use [NSThread isMainThread]. POSIX programs may use
240.Xr pthread_main_np 3 .
241.Pp
242.Fn dispatch_get_current_queue
243may return a queue owned by a different subsystem which has already had all
244external references to it released. While such a queue will continue to exist
245until all blocks submitted to it have completed, attempting to retain it is
246forbidden and will trigger an assertion. If Objective-C Automatic Reference
247Counting is enabled, any use of the object returned by
248.Fn dispatch_get_current_queue
249will cause retain calls to be automatically generated, so the use of
250.Fn dispatch_get_current_queue
251for any reason in code built with ARC is particularly strongly discouraged.
252.Sh COMPATIBILITY
253Cocoa applications need not call
254.Fn dispatch_main .
255Blocks submitted to the main queue will be executed as part of the "common
256modes" of the application's main NSRunLoop or CFRunLoop.
257However, blocks submitted to the main queue in applications using
258.Fn dispatch_main
259are not guaranteed to execute on the main thread.
260.Pp
261The dispatch framework is a pure C level API. As a result, it does not catch
262exceptions generated by higher level languages such as Objective-C or C++.
263Applications
264.Em MUST
265catch all exceptions before returning from a block submitted to a dispatch
266queue; otherwise the process will be terminated with an uncaught exception.
267.Pp
268The dispatch framework manages the relationship between dispatch queues and
269threads of execution. As a result, applications
270.Em MUST NOT
271delete or mutate objects that they did not create. The following interfaces
272.Em MUST NOT
273be called by blocks submitted to a dispatch queue:
274.Bl -bullet -offset indent
275.It
276.Fn pthread_cancel
277.It
278.Fn pthread_detach
279.It
280.Fn pthread_join
281.It
282.Fn pthread_kill
283.It
284.Fn pthread_exit
285.El
286.Pp
287Applications
288.Em MAY
289call the following interfaces from a block submitted to a dispatch queue if
290and only if they restore the thread to its original state before returning:
291.Bl -bullet -offset indent
292.It
293.Fn pthread_setcancelstate
294.It
295.Fn pthread_setcanceltype
296.It
297.Fn pthread_setschedparam
298.It
299.Fn pthread_sigmask
300.It
301.Fn pthread_setugid_np
302.El
303.Pp
304Applications
305.Em MUST NOT
306rely on the following interfaces returning predictable results between
307invocations of blocks submitted to a dispatch queue:
308.Bl -bullet -offset indent
309.It
310.Fn pthread_self
311.It
312.Fn pthread_getschedparam
313.It
314.Fn pthread_get_stacksize_np
315.It
316.Fn pthread_get_stackaddr_np
317.It
318.Fn pthread_mach_thread_np
319.It
320.Fn pthread_from_mach_thread_np
321.El
322.Pp
323While the result of
324.Fn pthread_self
325may change between invocations of blocks, the value will not change during the
326execution of any single block. Because the underlying thread may change beteween
327block invocations on a single queue, using per-thread data as an out-of-band
328return value is error prone. In other words, the result of calling
329.Fn pthread_setspecific
330and
331.Fn pthread_getspecific
332is well defined within a signle block, but not across multiple blocks. Also,
333one cannot make any assumptions about when the destructor passed to
334.Fn pthread_key_create
335is called. The destructor may be called between the invocation of blocks on
336the same queue, or during the idle state of a process.
337.Pp
338The following example code correctly handles per-thread return values:
339.Bd -literal -offset indent
340__block int r;
341__block int e;
342dispatch_sync(queue, ^{
343 r = kill(1, 0);
344 // Copy the per-thread return value to the callee thread
345 e = errno;
346});
347printf("kill(1,0) returned %d and errno %d\n", r, e);
348.Ed
349.Pp
350Note that in the above example
351.Va errno
352is a per-thread variable and must be copied out explicitly as the block may be
353invoked on different thread of execution than the caller. Another example of
354per-thread data that would need to be copied is the use of
355.Fn getpwnam
356instead of
357.Fn getpwnam_r .
358.Pp
359As an optimization,
360.Fn dispatch_sync
361invokes the block on the current thread when possible. In this case, the thread
362specific data such as
363.Va errno
364may persist from the block until back to the caller. Great care should be taken
365not to accidentally rely on this side-effect.
366.Pp
367.Sh SEE ALSO
368.Xr dispatch 3 ,
369.Xr dispatch_async 3 ,
370.Xr dispatch_object 3 ,
371.Xr dispatch_source_create 3