web-dev-qa-db-fra.com

sem_init sur OS X

Je travaille sur du code qui utilise les bibliothèques pthread et semaphore. Le sem_init la fonction fonctionne très bien sur ma machine Ubuntu, mais sur OS X la sem_init la fonction n'a absolument aucun effet. Y a-t-il un problème avec la bibliothèque ou existe-t-il une autre façon de procéder? 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 ne changent pas après le sem_init appel.

53
Nippysaurus

Les sémaphores sans nom ne sont pas pris en charge, vous devez utiliser des sémaphores nommés.

Pour utiliser des sémaphores nommés au lieu de sémaphores sans nom, utilisez sem_open au lieu de sem_init, et utilise sem_close et sem_unlink au lieu de sem_destroy.

86
Nippysaurus

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.

Initialisez 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.

18
Jess Bowers