Pourquoi sem_init(), sem_getvalue(), sem_destroy() obsolète sur Mac OS X et ce qui les remplace?
Quand je compile un programme en utilisant la POSIX sem_init()
fonction, je reçois un avertissement de compilation (erreur parce que j'ai l'habitude d'utiliser -Werror
) que la fonction est obsolète quand je compile sur Mac OS X 10.10.1 (Yosemite) avec GCC 4.9.1 ou la version de Clang (Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
) à partir de XCode 6.1.1. Un rapide coup d'oeil à /usr/include/sys/semaphore.h
montre que la fonction a en effet un __deprecated
tag après sa déclaration, que faire
sem_getvalue()
et
sem_destroy()
.
Questions:
-
Étant donné qu'il n'existe pas de soupçon d'autodérision dans la spécification POSIX, pourquoi ces trois fonctions de la considérer comme obsolète sur Mac OS X?
-
Étant donné qu'ils sont obsolètes, qu'est-ce que le remplacement, et pourquoi le remplacement préféré?
(Je n'ai vérifier Demandez À Différentes première; il n'y a pas de questions tagged c et pas de questions sur l'obsolète appels système — programmes seulement.)
- Liées à la stackoverflow.com/questions/1413785/sem-init-on-os-x et stackoverflow.com/questions/16655153/...?
- La première de ces deux semble couvrir mon problème dans la pratique, cependant il y a toujours le "pourquoi" (comme dans "pourquoi ne pas Mac OS X sans nom sémaphores?) qui est en suspens. Mais c'est sans doute le moins facilement répondu à la partie. Depuis que mon code n'était pas de la compilation, je n'étais pas en arriver au point d'un ENOSYS erreur de la
sem_init()
fonction. - Un autre et peut-être plus canonique de la source de la réponse peut être trouvée à l'aide de devforums.apple.com dans le "Noyau du système d'exploitation" sous-section de "Mac Développement".
- la mise en œuvre de structures de contrôle dans la mémoire partagée entre les processus est une surcharge considérable aussi bien dans le développement que dans l'exécution. Ils ont probablement ne veux pas engager que pour une interface qui n'a pas beaucoup d'utilisation dans un monde de threads. Leur façon de faire avec ce qui est en fait très ennuyeux, en fournissant une interface qui vient vous renvoie une erreur. Ce qui montre bien, encore une fois, que le respect de la norme POSIX est juste sur la surface. Ils ne sont pas vraiment à coeur de fournir un environnement ouvert.
Vous devez vous connecter pour publier un commentaire.
J'ai rencontré ce problème moi-même en essayant de port d'une bibliothèque, j'étais en train de travailler pour OS X. j'ai cherché un moment sans trouver une bonne réponse. Quand j'ai trouvé la réponse, j'ai été un peu perturbé: la réponse est effectivement "si Apple a mis en œuvre POSIX sans nom sémaphores, combien de X Sert achèteriez-vous?".
De résumer les points de pourquoi ils sont obsolètes et pourquoi une partie de la fonctionnalité n'a jamais été appliquée:
sem_t
type est difficilePour quoi faire au lieu de cela, je suis allé avec PGCD des sémaphores. Pourquoi le remplacement est préféré: c'est le seul natif sans nom sémaphore de l'interface disponible sur la vanille OS X. Apparemment PGCD aidés à vendre plus de X Sert. J'ai peur, il n'y a pas une meilleure réponse.
Cependant, j'espère que certains de code sera utile. Le résultat de tout cela est que vous devez mettre en place votre propre portable sémaphore interface:
C'est l'ensemble minimal de fonctionnalités, je m'y intéressai; vos besoins peuvent varier. Espérons que cela est utile.