sem_init sur OS X
Question
Je travaille sur un code qui utilise les bibliothèques pthread et sémaphore. La fonction sem_init
fonctionne bien sur ma machine Ubuntu, mais sous OS X, la fonction sem_init
n'a absolument aucun effet. Y a-t-il quelque chose qui ne va pas dans la bibliothèque ou y a-t-il une façon différente 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
.
La solution
Les sémaphores non nommés 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 non nommés, utilisez sem_open
au lieu de sem_init
, et utilisez sem_close
et sem_unlink
au lieu de sem_destroy
.
Autres conseils
Une meilleure solution (ces jours-ci) que les sémaphores nommés sous OS X est dispatch_semaphore_t de Grand Central Dispatch. Cela ressemble beaucoup aux sémaphores POSIX non nommés.
Initialiser le sémaphore:
#include <dispatch/dispatch.h>
dispatch_semaphore_t semaphore;
semaphore = dispatch_semaphore_create(1); // init with value of 1
Wait & amp; poste (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.