2009-09-11 19 views
47

Estoy trabajando en algún código que use las bibliotecas pthread y semáforo. La función sem_init funciona bien en mi máquina ubuntu, pero en OS X la función sem_init no tiene ningún efecto. ¿Hay algún problema con la biblioteca o hay una forma diferente de hacerlo? Este es el código que estoy usando para probar.sem_init en 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); 

Los valores parecen ser números aleatorios, y no cambian después de la llamada sem_init.

+3

Debe probar el valor de retorno de 'sem_init'. – bfontaine

+0

Tenga en cuenta que en Mac OS X Yosemite (10.10) al menos, 'sem_init()', 'sem_destroy()' y 'sem_getvalue()' están marcados como 'obsoletos' y generan advertencias de compilación como resultado. –

+0

@JonathanLeffler Oh, no. No puede funcionar en Mac OS X Yosemite (10.10.1). – vipygd

Respuesta

77

Los semáforos sin nombre no son compatibles, debe utilizar semáforos con nombre.

Para usar semáforos nombre, en lugar de semáforos sin nombre, utilice sem_open en lugar de sem_init, y el uso sem_close y sem_unlink en lugar de sem_destroy.

+32

Wow. '' declara 'sem_init' para que se compile correctamente en OS X, pero devuelve -1 con' errno' establecido en 'ENOSYS' (función no implementada). –

+0

Ok, ahora estoy buscando un buen ejemplo de semáforos usando C++ boost libraries. He oído que es una implementación robusta – jcpennypincher

+0

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

15

Una mejor solución (en estos días) que los semáforos con nombre en OS X es dispatch_semaphore_t de Grand Central Dispatch. Funciona muy parecido a los semáforos POSIX sin nombre.

inicializar el semáforo:

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

Espera & post (señal):

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

Destruye:

dispatch_release(semaphore); 

El archivo de cabecera está bien documentado y me pareció bastante fácil usar.

+0

El semáforo GCD es la función de nivel GCD. Teóricamente, puede causar problemas si se combina con el nivel pthread. – Eonil