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 .

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top