J'ai 3 classes de tâche (I, D, U) qui entrent dans une file d'attente, les tâches de la même classe doivent être traitées dans l'ordre. Je veux que les tâches s'exécutent aussi simultanément que possible; mais il y a des contraintes:modèle de conception pour l'exécution simultanée de tâches avec des contraintes
- U et D ne peuvent pas fonctionner en même temps
- U et je ne peux pas exécuter simultanément
- I (n) nécessite U (n) a terminé
Q: Quel (s) motif (s) de conception correspondraient à cette catégorie de problème?
J'ai deux approches j'envisage:
Approche 1: Utiliser 1 fil par tâche, chacun avec sa propre file d'attente. Chaque thread a une phase de démarrage synchronisée où il vérifie les conditions de démarrage, puis s'exécute, puis une phase d'arrêt synchronisée. Il est facile de voir que cela fournira une bonne simultanéité, mais je ne suis pas sûr si elle implémente correctement mes contraintes et ne se bloque pas.
D_Thread { ...
while (task = D_Queue.take()) {
synchronized (State) { // start phase
waitForU();
State.setRunning(D, true);
}
run(task); // run phase
synchronized (State) { // stop phase
State.setRunning(D, false)
}
}
}
Approche 2: Alternativement, un seul thread d'expédition gère l'état d'exécution et tâches horaires dans un ThreadPool, en attendant si nécessaire pour des tâches actuellement prévues pour terminer.
Pourriez-vous parler plus en détail troisième contrainte? Est-ce que I et U viennent par paires et que chacun d'eux requiert son U apparié, ou il n'y a pas de telles paires, mais simplement le nombre de I complétés ne peut pas être supérieur au nombre de U complétés? Ou autre chose? – Dialecticus
2) Quel est le coût en temps pour chaque catégorie de tâches? Est-ce qu'ils prennent environ le même temps pour terminer? – Dialecticus
Un peu des deux. U (n) est une sorte de vidage de cache, il implique U (n-1) U (n-2) ... et ainsi de suite; Il est donc possible de traiter plusieurs à la fois. Chaque opération a une position associée à elle; D (k) crée donc une exigence pour U (k). Ils ont été conçus comme des exemples; Je ne demande pas aux gens de résoudre complètement ce problème; recommande juste quelques modèles de conception. – Justin