Les Sémaphores POSIX sur Mac OS X: sem_timedwait alternative
Je suis en train de porter un projet (de linux) qui utilise des Sémaphores pour Mac OS X cependant, certains des sémaphores posix ne sont pas mises en œuvre sur Mac OS X
Celui que j'ai frappé dans ce port est sem_timedwait()
Je ne sais pas beaucoup sur les sémaphores, mais de l'homme pages sem_wait()
semble être proche de sem_timedwait
et il est mis en œuvre
De l'homme pages
sem_timedwait()
fonction de
verrouiller le sémaphore référencé par
sem
comme dans lesem_wait()
fonction.
Toutefois, si le sémaphore ne peut pas être
verrouillé sans attendre pour un autre
processus ou thread pour déverrouiller l'
sémaphore en effectuant unesem_post()
fonction, cette attente est ter-
minated lorsque le délai spécifié
expire
À partir de ma compréhension limitée de la façon dont semphores travail je vois que sem_timedwait()
est plus sûre, mais j'ai encore devrait être en mesure d'utiliser sem_wait()
Est-ce correct? Si non quelles sont les autres alternatives dois-je...
Grâce
OriginalL'auteur hhafez | 2009-03-13
Vous devez vous connecter pour publier un commentaire.
Il est probable que le délai d'attente est important pour le fonctionnement de l'algorithme. Donc à l'aide de
sem_wait()
peut ne pas fonctionner.Vous pouvez utiliser
sem_trywait()
, qui retourne tout de suite dans tous les cas. Vous pouvez ensuite en boucle, et l'utilisation d'un intervalle de sommeil que vous choisissez, à chaque fois que la décrémentation de la total délai d'attente jusqu'à ce que vous exécutez hors de délai d'attente ou le sémaphore est acquis.Une bien meilleure solution est de réécrire l'algorithme à utiliser une variable de condition, et puis vous pouvez utiliser
pthread_cond_timedwait()
pour obtenir les timeout.Comment réécrire une variable de condition que les œuvres de la croix-processus, n'importe qui?
Je suppose que ça a été un moment depuis que vous dérangé vous-même avec l'aide de variables conditionnelles pour l'inter-processus événements dans macOS. Je suis actuellement aux prises avec la même situation... peut-être avez-vous une idée sur la façon de mettre en œuvre une substitution à
sem_wait
?github.com/pmahoney/process_shared peut être utile, mais je n'ai aucune idée moi-même, désolé!
OriginalL'auteur Jared Oberhaus
Avez-vous envisagé d'utiliser apache portable runtime? Il est pré-installé sur tous les Mac OS X Box et beaucoup de distributions Linux et il est livré avec une plate-forme neutre wrapper autour de fil de simultanéité, qui fonctionne même sur MS Windows:
http://apr.apache.org/docs/apr/1.3/group__apr__thread__cond.html
OriginalL'auteur flitzwald
Encore une autre solution peut être d'utiliser le sem_timedwait.c
la mise en œuvre de Keith Shortridge de l'Australien de l'Observatoire Astronomique du groupe logiciel.
À partir du fichier source:
C'est maintenant au github.com/attie/libxbee3/blob/master/xsys_darwin/...
OriginalL'auteur chad
Pourrait vous essayez d'imiter la fonctionnalité de la sem_timedwait() appel en commençant par un timer dans un autre thread qui appelle sem_post() après l'expiration de la minuterie si il n'a pas été appelé par le thread principal qui est censé appeler sem_post()?
OriginalL'auteur stinkymatt
Je pense que la solution la plus simple est d'utiliser sem_wait() en combinaison avec un appel de l'alarme (le) réveil d'abandonner l'attente. Par exemple:
Un problème est que l'alarme ne prend que quelques secondes en entrée, donc le temps d'attente peut être trop long dans votre cas.
-- aghiles
OriginalL'auteur Aghiles
J'ai l'habitude d'utiliser les sémaphores nommés sur OSX, mais maintenant sem_timedwait n'est pas disponible et sem_init et les amis sont obsolètes. J'ai mis en place à l'aide de sémaphores pthread mutex et conditions ci-dessous qui travail pour moi (OSX 10.13.1). Vous pourriez avoir à faire une poignée vs structure de la table pour regarder la sem_t type si il ne peut pas tenir un ptr (c'est à dire les pointeurs sont 64bits et sem_t est de 32?)
#include <semaphore.h>
avectypedef sem_t long int
et le corps de votre code. Il vous manque un return 0 à la fin de sem_post(), par la manière. Votre code n'est pas une simple addition de sem_timedwait(), mais pour les cas où être appliqué, il semble grand!OriginalL'auteur Brian
Si vous pouvez simplement utiliser la MP API:
MPWaitOnSemaphore
existe aveckMPTimeoutErr
si le délai imparti est dépassé sans signalisation.OriginalL'auteur Valda
Je comptais sur l'aide de la fonction suivante comme un remplacement, mais j'ai ensuite découvert que sem_getvalue() a été également obsolète et non-fonctionnelles sur OSX. Vous êtes libre de les utiliser légèrement le code non testé sous un MIT ou licence LGPL (de votre choix).
SIGALRM plus de sens que SIGUSR2 comme un autre exemple ici utilise apparemment (je n'ai pas la peine de le regarder). SIGALRM est surtout réservé pour l'alarme() appelle, qui sont pratiquement inutile quand vous le souhaitez sous-deuxième résolution.
Ce code tente d'abord d'acquérir le sémaphore avec sem_trywait(). Si qui succède immédiatement, puis il écope. Sinon, il démarre un thread qui est l'endroit où le chronomètre est mis en œuvre par pthread_cond_timedwait(). Le MxSignaled booléen est utilisé pour déterminer le délai d'expiration de l'etat.
Vous pouvez également trouver cette fonction utile pour appeler le ci-dessus sem_timedwait() mise en œuvre (encore une fois, MIT ou LGPL, de votre choix):
Permet de remplir une structure timespec avec la chose la plus proche de ce que clock_gettime() peut fournir. Il y a divers commentaires qui appel host_get_clock_service() à plusieurs reprises est cher. Mais à partir un thread qui est également coûteux.
La vraie solution est pour Apple de mettre en œuvre l'ensemble de la spécification POSIX, et pas seulement les parties obligatoires. Œuvre de l'obligatoire bits de la norme POSIX et puis à réclamer POSIX conformité, laisse tout le monde avec une demi-cassé des OS et des tonnes de solutions de contournement comme ci-dessus, qui ont peut-être moins-que-idéales de performance.
Ci-dessus dit, je suis d'abandonner sur les sémaphores (les deux Sys V et POSIX), Mac OSX et Linux. Elles sont divisées en tout un peu plutôt malheureux façons. Tout le monde doit abandonner sur eux trop. (Je ne suis pas céder sur les sémaphores sur les Systèmes d'exploitation, juste le natif de mise en œuvre.) En tout cas, maintenant tout le monde a un sem_timedwait() de la mise en œuvre sans restrictions commerciales que d'autres peuvent copier-pâtes au contenu de leur coeur.
OriginalL'auteur CubicleSoft