Pourquoi sem_init (), sem_getvalue (), sem_destroy () sont obsolètes sur Mac OS X – et qu’est-ce qui les remplace?

Lorsque je comstack un programme à l’aide de la fonction POSIX sem_init() , un avertissement de compilation (erreur car j’utilise normalement -Werror ) -Werror que la fonction est obsolète lorsque je comstack sous 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 coup d’œil sur /usr/include/sys/semaphore.h montre que la fonction a bien une balise __deprecated après sa déclaration, tout comme sem_getvalue() et sem_destroy() .

Des questions:

  1. Étant donné que la spécification POSIX ne contient aucune trace de dépréciation, pourquoi ces trois fonctions sont-elles désignées comme dépréciées sous Mac OS X?

  2. Étant donné qu’ils sont déconseillés, quel est le remplacement et pourquoi le remplacement est-il préféré?

( J’ai d’abord vérifié Ask Different ; il n’y a pas de questions marquées c ni de questions se rapportant aux appels système obsolètes – uniquement aux programmes. )

J’ai moi-même rencontré ce problème lorsque j’ai essayé de transférer une bibliothèque sur laquelle je travaillais sous OS X. J’ai cherché pendant un moment sans trouver de bonne réponse. Lorsque j’ai trouvé la réponse, j’étais un peu perturbé: la réponse est effectivement “si Apple implémentait des sémaphores non nommés POSIX, combien de X Serves achèteriez-vous?” .

Pour résumer les raisons pour lesquelles elles sont déconseillées et pourquoi certaines fonctionnalités ne sont pas implémentées:

  • L’annexe 9 de la spécification UNIX unique indique qu’il ne s’agit pas d’interfaces obligatoires.
  • “Le code le plus portable” utilise des sémaphores SYSV
  • La compatibilité ascendante avec les sémaphores nommés POSIX, qui partagent le type sem_t est difficile

Quant à savoir quoi faire à la place, j’ai opté pour les sémaphores GCD. Pourquoi le remplacement est-il préféré: c’est la seule interface de sémaphore native non nommée disponible sur vanilla OS X. Apparemment, GCD les a aidés à vendre plus de X Serves. Je crains qu’il n’y ait pas de meilleure réponse.

Cependant, espérons que certains codes seront utiles. Le résultat de tout cela est que vous devez effectivement implémenter votre propre interface de sémaphore portable:

 #ifdef __APPLE__ #include  #else #include  #endif struct rk_sema { #ifdef __APPLE__ dispatch_semaphore_t sem; #else sem_t sem; #endif }; static inline void rk_sema_init(struct rk_sema *s, uint32_t value) { #ifdef __APPLE__ dispatch_semaphore_t *sem = &s->sem; *sem = dispatch_semaphore_create(value); #else sem_init(&s->sem, 0, value); #endif } static inline void rk_sema_wait(struct rk_sema *s) { #ifdef __APPLE__ dispatch_semaphore_wait(s->sem, DISPATCH_TIME_FOREVER); #else int r; do { r = sem_wait(&s->sem); } while (r == -1 && errno == EINTR); #endif } static inline void rk_sema_post(struct rk_sema *s) { #ifdef __APPLE__ dispatch_semaphore_signal(s->sem); #else sem_post(&s->sem); #endif } 

C’était l’ensemble minimal de fonctionnalités qui me tenait à cœur; vos besoins peuvent varier. J’espère que cela est utile.