Unix manual page for dispatch_semaphore_create. (host=minya system=Darwin)
dispatch_semaphore_cr... BSD Library Functions Manual dispatch_semaphore_cr...

NAME
     dispatch_semaphore_create, dispatch_semaphore_signal,
     dispatch_semaphore_wait -- synchronized counting semaphore

SYNOPSIS
     #include <dispatch/dispatch.h>

     dispatch_semaphore_t
     dispatch_semaphore_create(long count);

     long
     dispatch_semaphore_signal(dispatch_semaphore_t semaphore);

     long
     dispatch_semaphore_wait(dispatch_semaphore_t semaphore,
         dispatch_time_t timeout);

DESCRIPTION
     Dispatch semaphores are used to synchronize threads.

     The 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 dispatch_semaphore_signal()
     before returning.  The timeout parameter is creatable with the
     dispatch_time(3) or dispatch_walltime(3) functions.

     The dispatch_semaphore_signal() function increments the counting sema-
     phore. If the previous value was less than zero, it wakes one of the
     threads that are waiting in dispatch_semaphore_wait() before returning.

COMPLETION SYNCHRONIZATION
     If the count parameter is equal to zero, then the semaphore is useful for
     synchronizing completion of work.  For example:

           sema = dispatch_semaphore_create(0);

           dispatch_async(queue, ^{
                   foo();
                   dispatch_semaphore_signal(sema);
           });

           bar();

           dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);

FINITE RESOURCE POOL
     If the 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:

           sema = dispatch_semaphore_create(getdtablesize() / 4);

     At each Unix FD allocation:

           dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
           fd = open("/etc/services", O_RDONLY);

     When each FD is closed:

           close(fd);
           dispatch_semaphore_signal(sema);

RETURN VALUES
     The dispatch_semaphore_create() function returns NULL if no memory is
     available or if the count parameter is less than zero.

     The dispatch_semaphore_signal() function returns non-zero when a thread
     is woken.  Otherwise, zero is returned.

     The dispatch_semaphore_wait() function returns zero upon success and non-
     zero after the timeout expires. If the timeout is DISPATCH_TIME_FOREVER,
     then dispatch_semaphore_wait() waits forever and always returns zero.

MEMORY MODEL
     Dispatch semaphores are retained and released via calls to
     dispatch_retain() and dispatch_release().

CAVEATS
     Unbalanced dispatch semaphores cannot be released.  For a given sema-
     phore, calls to dispatch_semaphore_signal() and dispatch_semaphore_wait()
     must be balanced before dispatch_release() is called on it.

SEE ALSO
     dispatch(3), dispatch_object(3)

Darwin                            May 1, 2009                           Darwin