Le prochain thread à débloquer sur son sem_wait()
sera le thread que le système d'exploitation décide est le prochain à basculer dans le contexte. Personne ne fait aucune garantie de commande; Cela dépend de la stratégie de planification de votre système d'exploitation. Il peut s'agir du thread qui a été désactivé le plus longtemps par le CPU, ou de celui qui a reçu la plus haute "priorité", ou de celui qui a historiquement eu certaines statistiques sur l'utilisation des ressources, ou autre. Il est probable que votre thread actuel (celui qui a appelé sem_post()
) continue de fonctionner pendant un certain temps, jusqu'à ce qu'il commence à attendre l'entrée de l'utilisateur, se bloque sur un autre sémaphore ou court en dehors de sa tranche horaire. Ensuite, le système d'exploitation va basculer dans un processus totalement indépendant pour fonctionner pendant une fraction de seconde (probablement Firefox ou quelque chose), puis aller gérer un peu de trafic réseau, se procurer une tasse de thé, et, enfin, quand il se déplace Pour cela, choisissez celui de vos autres threads, basé sur quelque chose comme si vous vous sentez basé sur l'histoire passée que le thread particulier est plus CPU ou I/O-bound.
Dans de nombreux systèmes d'exploitation, la priorité est donnée aux processus liés aux E/S qui ne sont pas présents depuis très longtemps. La théorie est que les nouveaux processus pourraient être de courte durée (si ça fait déjà cinq heures, il y a de fortes chances que ça ne finisse pas dans les prochaines 1ms), alors on pourrait aussi en finir avec eux. Les processus liés aux E/S sont susceptibles de continuer à être liés aux E/S, ce qui signifie qu'ils risquent d'éteindre la CPU sous peu en attendant d'autres ressources. Fondamentalement, le système d'exploitation veut trouver le processus qui va pouvoir être fait avec ASAP, donc il peut revenir à siroter son thé et exécuter votre malware.
Droit, mais est-il possible de savoir exactement comment la file d'attente fonctionne pour un sémaphore quand seulement 1 thread est autorisé à passer à la fois? – user82229
Les sémaphores ne font aucune garantie de commande. Ils n'ont pas besoin d'utiliser réellement une file d'attente ou une autre structure FIFO. Quand un seul thread est autorisé à la fois, quand il appelle V(), un autre thread (éventuellement aléatoire) retourne alors de son appel P() et continue. –
@Ben S: Pourquoi ne faites-vous pas la promotion de ce commentaire pour une partie de votre réponse? Je pense que c'est ce que voulait dire l'heluimwhippet en premier lieu, et c'est bien dit. – dmckee