1 .\" Copyright (c) 2008-2009 Apple Inc. All rights reserved.
7 .Nd schedule blocks for iterative execution
9 .Fd #include <dispatch/dispatch.h>
12 .Fa "size_t iterations" "dispatch_queue_t queue" "void (^block)(size_t)"
16 .Fa "size_t iterations" "dispatch_queue_t queue" "void *context" "void (*function)(void *, size_t)"
21 function provides data-level concurrency through a "for (;;)" loop like primitive:
23 dispatch_queue_t the_queue = dispatch_get_concurrent_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT);
24 size_t iterations = 10;
26 // 'idx' is zero indexed, just like:
27 // for (idx = 0; idx < iterations; idx++)
29 dispatch_apply(iterations, the_queue, ^(size_t idx) {
30 printf("%zu\\n", idx);
34 Like a "for (;;)" loop, the
36 function is synchronous.
37 If asynchronous behavior is desired, please wrap the call to
41 against another queue.
43 Sometimes, when the block passed to
45 is simple, the use of striding can tune performance.
46 Calculating the optimal stride is best left to experimentation.
47 Start with a stride of one and work upwards until the desired performance is
48 achieved (perhaps using a power of two search):
52 dispatch_apply(count / STRIDE, queue, ^(size_t idx) {
53 size_t j = idx * STRIDE;
54 size_t j_stop = j + STRIDE;
56 printf("%zu\\n", j++);
61 for (i = count - (count % STRIDE); i < count; i++) {
68 is a convenient wrapper around
70 and a semaphore to wait for completion.
71 In practice, the dispatch library optimizes this function.
75 function is a wrapper around
76 .Fn dispatch_apply_f .
78 .Xr dispatch_async 3 ,
79 .Xr dispatch_semaphore_create 3 ,
80 .Xr dispatch_queue_create 3