sem init sur OS X
Je travaille sur du code qui utilise les bibliothèques pthread et sémaphore. La fonction sem_init
fonctionne bien sur ma machine Ubuntu, mais sur OS X la fonction sem_init
n'a absolument aucun effet. Est-il quelque chose de mal avec la bibliothèque ou est-il un autre moyen de le faire? C'est le code que j'utilise pour tester.
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);
Les valeurs semblent être des nombres aléatoires, et elles ne changent pas après l'appel sem_init
.
2 réponses
Les sémaphores sans nom ne sont pas pris en charge, vous devez utiliser des sémaphores nommés.
Pour utiliser les sémaphores nommés au lieu de sans nom sémaphores, utiliser sem_open
au lieu de sem_init
, et l'utilisation sem_close
et sem_unlink
au lieu de sem_destroy
.
Une meilleure solution (de nos jours) que les sémaphores nommés sur OS X est dispatch_semaphore_t de Grand Central Dispatch. cela fonctionne très bien comme les sémaphores POSIX sans nom.
Initialiser le sémaphore:
#include <dispatch/dispatch.h>
dispatch_semaphore_t semaphore;
semaphore = dispatch_semaphore_create(1); // init with value of 1
Attendre et poster (signal):
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
...
dispatch_semaphore_signal(semaphore);
Détruire:
dispatch_release(semaphore);
Le fichier d'en-tête est bien documenté et je l'ai trouvé assez facile à utiliser.