PThread Semaphores
int pthread_mutex_init(pthread_mutex_t *name,
const pthread_mutexattr_t *attr);
int pthread_mutex_destroy(pthread_mutex_t *name);
int pthread_mutex_lock(pthread_mutex_t *name);
int pthread_mutex_trylock(pthread_mutex_t *name);
int pthread_mutex_unlock(pthread_mutex_t *name);
pthread semaphores are easier to use than semget() and semop()
all mutexes must be global
only the thread that locks a mutex can unlock it