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.
sema = dispatch_semaphore_create(0);
dispatch_async(queue, ^{
foo();
dispatch_semaphore_signal(sema);
});
bar();
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
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);
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.