sem_init donde OS X
Pregunta
Estoy trabajando en un código que utiliza las bibliotecas pthread y semaphore. La función sem_init
funciona bien en mi máquina Ubuntu, pero en OS X la función sem_init
no tiene absolutamente ningún efecto. ¿Hay algo mal con la biblioteca o hay una forma diferente de hacerlo? Este es el código que estoy usando para probar.
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
.
Solución
No se admiten semáforos sin nombre, debe usar semáforos con nombre.
Para usar semáforos con nombre en lugar de semáforos sin nombre, use sem_open
en lugar de sem_init
, y use sem_close
y sem_unlink
en lugar de sem_destroy
.
Otros consejos
Una solución mejor (en estos días) que los semáforos nombrados en OS X es el envío de Grand Central Dispatch_semaphore_t. 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 & amp; post (señal):
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
...
dispatch_semaphore_signal(semaphore);
Destruir:
dispatch_release(semaphore);
El archivo de encabezado está bien documentado y lo encontré bastante fácil de usar.