dispatch_semaphore_create

Section: C Library Functions (3)
Page Index

BSD mandoc
Darwin  

NAME

dispatch_semaphore_create dispatch_semaphore_signal dispatch_semaphore_wait - synchronized counting semaphore  

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  

DESCRIPTION

Dispatch semaphores are used to synchronize threads.

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 dispatch_time3 or dispatch_walltime3 functions. If the timeout is reached without a signal being received, the semaphore is re-incremented before the function returns.

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.  

COMPLETION SYNCHRONIZATION

If the Fa 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 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:
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 Fn dispatch_semaphore_create function returns NULL if no memory is available or if the Fa count parameter is less than zero.

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

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.  

MEMORY MODEL

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

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.  

SEE ALSO

dispatch(3), dispatch_object3


 

Index

NAME
SYNOPSIS
DESCRIPTION
COMPLETION SYNCHRONIZATION
FINITE RESOURCE POOL
RETURN VALUES
MEMORY MODEL
CAVEATS
SEE ALSO