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.

51
demandé sur Ivan 2009-09-12 03:57:59

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.

80
répondu Nippysaurus 2011-09-27 20:49:35

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.

16
répondu Jess Bowers 2014-07-07 18:27:32