Nel man page sembra che anche se si inizializzare un semaforo per un valore di uno:Come inizializzare un semaforo binario in C
sem_init(&mySem, 0, 1);
Si potrebbe ancora essere incrementato ad un valore superiore a 1 con più chiamate a
sem_post(&mySem);
Ma in questo code example il commento sembra pensare in modo diverso:
sem_init(&mutex, 0, 1); /* initialize mutex to 1 - binary semaphore */
È possibile inizializzare un semaforo strettamente binario in C?
Nota: la ragione per eseguire questa operazione invece di utilizzare un mutex in questo caso è che sem_post e sem_wait possono essere chiamati da diversi thread.
Grazie mille! Avevo finito per fare più o meno quello. – austinmarton
Qual è esattamente il punto del ciclo 'while' in' mysem_wait'? Una semplice istruzione 'if' non eseguirà il lavoro poiché' pthread_cond_wait' richiederà il mutex dopo essere stato segnalato e 'pthread_cond_signal' sbloccherà solo un singolo thread in attesa della condizione? –
@BillDeRose: le variabili di condizione sono soggette a wakeups spuri e wakeup rubati. Devi ** usarli in un ciclo se vuoi verificare una condizione. –