Semaphores
Mutex locks, as mentioned earlier, are generally considered the simplest of synchronization tools. But sometimes we need a more robust tool that can also provide more sophisticated ways for processes to synchronize their activities.
A semaphore S is an integer variable that, apart from initialization, is accessed only through two standard atomic operations: wait()
and signal()
.
A mutex is particular case of semaphor with S = 1
.
POSIX API
sem_init()
int sem_init(sem_t *sem, int pshared, unisigned int value);
This sets the semaphore sem
with S = value
. Use 0 for pshared
.
sem_wait()
and sem_post()
sem_wait()
decrements S
with one unit, but if S=0
then the function waits for the value to rise before further decrementing, thus blocking the thread!
sem_post()
increments S
with one unit and if there are blocked threads, then it frees the one who waited the most in the queue.
To destroy a semaphore, use sem_destroy(sem_t *sem)
.