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 .

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top