macOS lacks unnamed semaphore implementations. As named semaphores are not private, they're not realiable as they can be controlled publicly via name. I see DispatchSemaphore is implemented using `sem_init` which is unnamed semaphores. It seems unnamed semaphores are allowed only for system code. If DispatchSemaphore is simply a wrapper around pthread unnamed semaphore, it would be safe to use them to control pthread. But as it is a GCD level object, I actually don't know whether they're actually safe for pthread.
Is it safe to use DispatchSemaphore with pthread stuffs?
Yes, it's safe. Pthreads is the foundation for threading in higher-level APIs like GCD, so GCD worker threads are also pthreads (although you don't own them, so you must not manipulate them via the pthreads API).
Also, a typical use case for dispatch semaphore is to coordinate between a non-GCD thread and a GCD task. For example, some code dispatches a task asynchronously and then, when it needs the result, waits on a semaphore that the task is to signal when it's done. There's no requirement that the code doing that be on a GCD thread.