I don't understand why the signal remove P from Q if the value is negative.
if (value <=0) {
remove P from Q;
Se il valore è negativo, value <= 0
è true e P sarà rimosso.
Se osservi altre implementazioni, ad esempio la descrizione su link rispetto alla descrizione al link quindi ci sono differenze, ad esempio nell'implementazione di Windows il conteggio non può essere inferiore a zero e le risorse sono disponibili se il conteggio è maggiore di zero:
A semaphore object is a synchronization object that maintains a count between zero and a specified maximum value. The count is decremented each time a thread completes a wait for the semaphore object and incremented each time a thread releases the semaphore. When the count reaches zero, no more threads can successfully wait for the semaphore object state to become signaled. The state of a semaphore is set to signaled when its count is greater than zero, and nonsignaled when its count is zero.
Each time one of the wait functions returns because the state of a semaphore was set to signaled, the count of the semaphore is decreased by one. The ReleaseSemaphore function increases a semaphore's count by a specified amount. The count can never be less than zero or greater than the maximum value.
Questa implementazione sembra funzionare in senso inverso, qualcosa come
Wait(Process P)
if (value == 0)
add P to Q;
P->block();
else
value = value -1;
Release(count)
value = value + count
if value > max_count
value = max_count
while (value > 0 and Q is not empty )
value = value - 1
remove P from Q
P->wakeup()
La differenza tra questo comportamento e quello dei semafori descritto al link è che 'valore' è l'unico in assoluto il numero di risorse disponibili, piuttosto che diventare negativo se ci sono processi in attesa.