Atomically decrements the internal counter by
1 and (if necessary) blocks the calling
thread until the counter reaches zero.
The behavior is undefined if the internal counter is already zero.
 Return value