logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

dispatch_semaphore_create, dispatch_semaphore_signal, dispatch_semaphore_wait — synchronized counting

Caveats

       Dispatch semaphores are strict counting semaphores.  In other words, dispatch semaphores do not  saturate
       at any particular value.  Saturation can be achieved through atomic compare-and-swap logic.  What follows
       is a saturating binary semaphore:

       void
       saturating_semaphore_signal(dispatch_semaphore_t dsema, int *sent)
       {
               if (__sync_bool_compare_and_swap(sent, 0, 1)) {
                       dispatch_semaphore_signal(dsema);
               }
       }

       void
       saturating_semaphore_wait(dispatch_semaphore_t dsema, int *sent)
       {
               *sent = 0;
               dispatch_semaphore_wait(dsema, DISPATCH_TIME_FOREVER);
       }

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);

Description

       Dispatch semaphores are used to synchronize  threads.   The  timeout  parameter  is  creatable  with  the
       dispatch_time(3) or dispatch_walltime(3) functions.

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);

Memory Model

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

Name

       dispatch_semaphore_create,  dispatch_semaphore_signal,  dispatch_semaphore_wait  —  synchronized counting
       semaphore

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.

See Also

dispatch(3), dispatch_object(3)

Darwin                                             May 1, 2009                      dispatch_semaphore_create(3)

Synopsis

#include<dispatch/dispatch.h>dispatch_semaphore_tdispatch_semaphore_create(longcount);

       longdispatch_semaphore_signal(dispatch_semaphore_tsemaphore);

       longdispatch_semaphore_wait(dispatch_semaphore_tsemaphore, dispatch_time_ttimeout);

See Also