sem_init su OS X
Domanda
Sto lavorando ad un codice che utilizza le librerie pthread e semaphore. La funzione sem_init
funziona perfettamente sulla mia macchina Ubuntu, ma su OS X la funzione sem_init
non ha assolutamente alcun effetto. C'è qualcosa che non va nella biblioteca o c'è un modo diverso di farlo? Questo è il codice che sto usando per testare.
sem_t sem1;
sem_t sem2;
sem_t sem3;
sem_t sem4;
sem_t sem5;
sem_t sem6;
sem_init(&sem1, 1, 1);
sem_init(&sem2, 1, 2);
sem_init(&sem3, 1, 3);
sem_init(&sem4, 1, 4);
sem_init(&sem5, 1, 5);
sem_init(&sem6, 1, 6);
I valori sembrano essere numeri casuali e non cambiano dopo la chiamata sem_init
.
Soluzione
I semafori senza nome non sono supportati, è necessario utilizzare i semafori denominati.
Per usare semafori con nome invece di semafori senza nome, usa sem_open
invece di sem_init
e usa sem_close
e sem_unlink
anziché sem_destroy
.
Altri suggerimenti
Una soluzione migliore (oggigiorno) dei semafori nominati su OS X è dispatch_semaphore_t di Grand Central Dispatch. Funziona in modo molto simile ai semafori POSIX senza nome.
Inizializza il semaforo:
#include <dispatch/dispatch.h>
dispatch_semaphore_t semaphore;
semaphore = dispatch_semaphore_create(1); // init with value of 1
Aspetta & amp; post (segnale):
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
...
dispatch_semaphore_signal(semaphore);
Destroy:
dispatch_release(semaphore);
Il file di intestazione è ben documentato e l'ho trovato abbastanza facile da usare.