| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- .\" Copyright (c) 2008-2012 Apple Inc. All rights reserved.
- .Dd May 1, 2009
- .Dt dispatch_semaphore_create 3
- .Os Darwin
- .Sh NAME
- .Nm dispatch_semaphore_create ,
- .Nm dispatch_semaphore_signal ,
- .Nm dispatch_semaphore_wait
- .Nd synchronized counting semaphore
- .Sh SYNOPSIS
- .Fd #include <dispatch/dispatch.h>
- .Ft dispatch_semaphore_t
- .Fo dispatch_semaphore_create
- .Fa "long count"
- .Fc
- .Ft long
- .Fo dispatch_semaphore_signal
- .Fa "dispatch_semaphore_t semaphore"
- .Fc
- .Ft long
- .Fo dispatch_semaphore_wait
- .Fa "dispatch_semaphore_t semaphore" "dispatch_time_t timeout"
- .Fc
- .Sh DESCRIPTION
- Dispatch semaphores are used to synchronize threads.
- .Pp
- The
- .Fn dispatch_semaphore_wait
- function decrements the semaphore. If the resulting value is less than zero,
- it waits for a signal from a thread that increments the semaphore by calling
- .Fn dispatch_semaphore_signal
- before returning.
- The
- .Fa timeout
- parameter is creatable with the
- .Xr dispatch_time 3
- or
- .Xr dispatch_walltime 3
- functions. If the timeout is reached without a signal being received, the semaphore
- is re-incremented before the function returns.
- .Pp
- The
- .Fn dispatch_semaphore_signal
- function increments the counting semaphore. If the previous value was less than zero,
- it wakes one of the threads that are waiting in
- .Fn dispatch_semaphore_wait
- before returning.
- .Sh COMPLETION SYNCHRONIZATION
- If the
- .Fa count
- parameter is equal to zero, then the semaphore is useful for synchronizing
- completion of work.
- For example:
- .Bd -literal -offset indent
- sema = dispatch_semaphore_create(0);
- dispatch_async(queue, ^{
- foo();
- dispatch_semaphore_signal(sema);
- });
- bar();
- dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
- .Ed
- .Sh FINITE RESOURCE POOL
- If the
- .Fa count
- parameter is greater than zero, then the semaphore is useful for managing a
- finite pool of resources.
- For example, a library that wants to limit Unix descriptor usage:
- .Bd -literal -offset indent
- sema = dispatch_semaphore_create(getdtablesize() / 4);
- .Ed
- .Pp
- At each Unix FD allocation:
- .Bd -literal -offset indent
- dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
- fd = open("/etc/services", O_RDONLY);
- .Ed
- .Pp
- When each FD is closed:
- .Bd -literal -offset indent
- close(fd);
- dispatch_semaphore_signal(sema);
- .Ed
- .Sh RETURN VALUES
- The
- .Fn dispatch_semaphore_create
- function returns NULL if no memory is available or if the
- .Fa count
- parameter is less than zero.
- .Pp
- The
- .Fn dispatch_semaphore_signal
- function returns non-zero when a thread is woken.
- Otherwise, zero is returned.
- .Pp
- The
- .Fn dispatch_semaphore_wait
- function returns zero upon success and non-zero after the timeout expires. If
- the timeout is DISPATCH_TIME_FOREVER, then
- .Fn dispatch_semaphore_wait
- waits forever and always returns zero.
- .Sh MEMORY MODEL
- Dispatch semaphores are retained and released via calls to
- .Fn dispatch_retain
- and
- .Fn dispatch_release .
- .Sh CAVEATS
- Unbalanced dispatch semaphores cannot be released.
- For a given semaphore, calls to
- .Fn dispatch_semaphore_signal
- and
- .Fn dispatch_semaphore_wait
- must be balanced before
- .Fn dispatch_release
- is called on it.
- .Sh SEE ALSO
- .Xr dispatch 3 ,
- .Xr dispatch_object 3
|