2009-09-11 38 views
47

Sto lavorando su un codice che utilizza le librerie pthread e semaforo. La funzione sem_init funziona bene sulla mia macchina Ubuntu, ma su OS X la funzione sem_init non ha assolutamente alcun effetto. C'è qualcosa di sbagliato nella libreria o c'è un modo diverso di farlo? Questo è il codice che sto usando per testare.sem_init su OS X

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.

+3

Si dovrebbe verificare il valore di ritorno di 'sem_init'. – bfontaine

+0

Nota che in Mac OS X Yosemite (10.10) almeno, 'sem_init()', 'sem_destroy()' e 'sem_getvalue()' sono contrassegnati come 'deprecati' e generano avvisi del compilatore come risultato. –

+0

@JonathanLeffler Oh, no. Non può funzionare in Mac OS X Yosemite (10.10.1). – vipygd

risposta

77

I semafori non supportati non sono supportati, è necessario utilizzare i nomi dei semafori.

Per utilizzare nome semafori al posto di semafori senza nome, utilizzare sem_open invece di sem_init, e utilizzare sem_close e sem_unlink invece di sem_destroy.

+32

Wow. '' dichiara 'sem_init' in modo che compili correttamente su OS X, ma restituisce -1 con' errno' impostato su 'ENOSYS' (funzione non implementata). –

+0

Ok, ora sto cercando un buon esempio di semafori usando le librerie boost C++. Ho sentito che è una robusta implementazione – jcpennypincher

+0

'sem_getvalue()' non funziona ...... Vedere http://stackoverflow.com/questions/16655153/sem-getvalue-dysfunctionality-in-mac-os -xc/16655541 # 16655541 – user454322

15

Una soluzione migliore (al giorno d'oggi) dei semafori con nome su OS X è dispatch_semaphore_t di Grand Central Dispatch. Funziona molto come i semafori POSIX senza nome.

inizializzare il semaforo:

#include <dispatch/dispatch.h> 
dispatch_semaphore_t semaphore; 
semaphore = dispatch_semaphore_create(1); // init with value of 1 

Attendere & posta (segnale):

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 
... 
dispatch_semaphore_signal(semaphore); 

Destroy:

dispatch_release(semaphore); 

Il file di intestazione è ben documentato e ho trovato abbastanza facile usare.

+0

Il semaforo GCD è una funzionalità di livello GCD. Teoricamente, può causare qualche problema se combinato con il livello di pthread. – Eonil