Sémaphore files d'attente
Je suis pour étendre la fonctionnalité d'un sémaphore. Je suis tombé sur un barrage routier, quand j'ai réalisé que je ne connais pas la mise en œuvre d'un sémaphore et à veiller à ce que mon code a couru correctement, j'ai besoin de savoir cela.
Je sais qu'un sémaphore fonctionne en bloquant les threads en attente sur elle quand ils appellent sem_wait() et un autre thread a actuellement verrouillé. Le fil est alors bloqué et puis dans une liste d'attente de la sémaphore.
Ma question porte sur ce qui se passe sur un sem_post(). Est le fil suivant tiré de la liste d'attente, d'autant que le verrouillage fil, et a permis de débloquer? Ou est le plan pour l'affichage de complètement différent?
Merci!
Vous devez vous connecter pour publier un commentaire.
Les sémaphores ont deux opérations:
P()
D'acquérir le sémaphore (vous semblez appeler de cettesem_wait
)V()
Pour libérer le sémaphore (vous semblez appeler de cettesem_post
)Les sémaphores ont aussi un entier associé à eux, qui est le nombre de threads simultanés autorisés à passer P() sans blocage. D'autres appels à P() bloque jusqu'à ce que V() est appelée pour libérer des taches.
Qui est la définition classique d'un sémaphore.
Edit: les Sémaphores ne faire aucune garantie de l'ordre. Ils n'ont pas à utiliser une file d'attente ou d'autres FIFO structure. Lorsqu'un seul thread à la fois est autorisé, lorsqu'il appelle V(), un autre (éventuellement aléatoire) thread sera ensuite de retour à partir de son P() appel et continuer.
Semaphores do not make any guarantee of order.
+1P(orderMutex); // Remember our order of arrival
et cet article de Wikipédia en.wikipedia.org/wiki/... s'écrit "signal: Incrémente la valeur du sémaphore variable de 1. Après l'incrémentation, si la pré-incrémentation de la valeur a été négatif (ce qui signifie qu'il existe des processus en attente d'une ressource), il transfère un processus bloqué depuis le sémaphore de la file d'attente pour le prêt de la file d'attente" ?Le prochain thread à débloquer sur c'est
sem_wait()
sera tout ce thread le système d'exploitation décide est le suivant d'un changement de contexte dans. Personne ne demande la garantie de la commande; tout dépend de votre OS de la planification de la stratégie. Il pourrait être le fil qui a été sur le CPU pour le plus long, ou celui qui a été attribué le plus de "priorité", ou celui qui a eu historiquement certaines ressources statistiques d'utilisation, ou quoi que ce soit.Le plus souvent, votre thread courant (celui qui a appelé
sem_post()
) continuera de fonctionner pendant un certain temps, jusqu'à ce qu'il commence d'attente pour l'entrée d'utilisateur, des blocs sur un autre sémaphore, ou à court de son système d'exploitation-attribué tranche de temps. Ensuite, le système d'exploitation interrupteur dans certains totalement sans rapport avec le processus à exécuter pendant une fraction de seconde (probablement Firefox ou quelque chose), ensuite aller au large et gérer un réseau de trafic, obtenir lui-même une tasse de thé, et, enfin, quand il fait autour d'elle, de choisir celui de votre autre fils, il se sent comme, basé sur quelque chose comme si il se sent basé sur l'histoire du passé que le fil est de plus de CPU ou I/O-lié.Dans de nombreux Systèmes d'exploitation, la priorité est donnée à I/O-lié processus qui n'ont pas été autour depuis très longtemps. La théorie est que les nouveaux processus pourrait être de courte durée (si elle a été autour depuis cinq heures déjà, les chances sont, il ne sera pas finir à la prochaine 1ms), de sorte que nous pourrions obtenir avec. I/O-lié processus sont susceptibles de continuer à être liées aux e/S, ce qui signifie que les chances sont qu'ils vont éteindre le PROCESSEUR peu de temps en attendant que d'autres ressources. Fondamentalement, le système d'exploitation veut trouver le processus qui va pouvoir être fait avec le plus tôt possible, de sorte qu'il peut revenir à siroter son thé et l'exécution de vos programmes malveillants.