Even better; use NSOperationQueue or the GCD queue as your synchronization primitive.
Locks are expensive, and semaphores are more or less blocked by a counter.
Queue-based coding is much more efficient, especially when using the built-in queue mechanisms.
source share