2010-11-21 24 views
1

Supposons que nous ayons un sémaphore et que plusieurs threads l'attendent en appelant P (s). Alors V (s) réveillerait exactement un fil parmi eux. Existe-t-il un moyen de réveiller un thread désigné au lieu de demander au système de prendre la décision? Par exemple, dans le problème du salon de coiffure, après chaque coupe, le barbier veut servir le plus long client en attente, au lieu d'un client aléatoire.Comment utiliser V pour réveiller un P désigné?

+0

En ne tenant pas compte de la balise 'language-agnostic':' java.util.concurrent.Semaphore' a 'fairNess' qui garantit le premier entré, premier sorti. Mais ce n'est pas une réponse, puisque la désignation peut être sur un autre paramètre. – khachik

Répondre

1

Vous pouvez simplement utiliser une file d'attente pour stocker les P. Cela vous permettra de le faire en fonction de la plus longue attente. Si ce n'est pas le cas, vous pouvez stocker dans un arbre trié en fonction de n'importe quel paramètre que vous voulez, et supprimer si nécessaire. Je pense que le nœud de tout cela serait une sorte de mécanisme de commande pour les P, ce qui ne serait pas trop compliqué.

1

Cela dépend de l'implémentation du sémaphore. Vous devez utiliser un sémaphore intelligent qui crée une file d'attente de threads et les signale dans le bon ordre. Je pense que l'implémentation régulière de sémaphore sur Windows ne fonctionne pas de cette façon. Il envoie juste un signal à l'OS, qui à son tour envoie un signal à l'un des threads en attente. Il serait même logique si cela utilise une pile lifo, car cela est mis en œuvre plus facilement. Mais il ne serait pas difficile de construire cela vous-même en implémentant une file d'attente, qui pourrait être une liste chaînée, ou un tableau cyclique.

1

Non, pas avec les sémaphores classiques par eux-mêmes. Si vous voulez un comportement semblable à une file d'attente, vous créez une file d'attente (avec un sémaphore, ou peut-être deux ou trois) pour protéger les structures de données partagées de la file d'attente. En réalité, si les sémaphores sont théoriquement tout ce dont vous avez besoin pour faire la synchronisation, vous écrivez rarement (jamais?) Un corps significatif de code réel qui utilise directement des sémaphores nus. La plupart du temps, vous construisez des constructions de niveau supérieur avec (par exemple) un sémaphore pour protéger ces données critiques dans cette construction.