Bonjour tout le monde,
Je m'excuse pour la longueur du post... les questions se trouvent à la fin... c'est juste pour expliquer sur quoi je travaille
Je suis actuellement en train de développer une applic qui n'a pas le droit d'utiliser les threads. Je sais que ca peut paraître débile, mais dans le cadre de travail, c'est tout à fait justifier. Les superordinateurs sont fait pour calculer des données utilisateur et pas pour perdre leur temps à faire du switch de contexte entre deux threads qui tourne.
Donc les développeurs des langages et des OS ne permettent pas à un programme de lancer un nouveau thread.
Ce que nous avons décidé (moi, mon collègue et notre responsable de projet) de poll le réseau (et oui on doit s'occuper du réseau en plus) uniquement lorsque l'on a la main... évident vous me direz.
Donc mon applic récup des données sur le réseau et en fonction de ca lance des méthodes sur un objet. Nous faisons donc un poll de réseau à chaque fois qu'une méthode de l'objet se termine et à chaque fois qu'il tente d'accéder à une variable sensible (vive les mutex et les sémaphores).
On savons quand il accède à une variable sensible lorsqu'il fait l'appel àqu'il doit ensuite libérer par
Code : Sélectionner tout - Visualiser dans une fenêtre à part mutex.lock()Notre problème devient alors comment assurer qu'il n'y aie pas de deadlock en faisant des appels en cascade.
Code : Sélectionner tout - Visualiser dans une fenêtre à part mutex.unlock()
Ex de deadlock :
La première method fait un lock(cond1). Cette condition a été locker préalablement par une autre fonction qui est a présent terminée. Comme c'est un lock bloquant, on poll le réseau et on prend la suivante.
Cette deuxième methode fait un lock(cond2) qui est une condition elle aussi lockée préalablement par une autre méthode alors terminée. Comme c'est un lock bloquant, on poll le réseau et on prend la méthode suivante dans la file d'attente.
par chance cette méthod fait un unlock(cond1) puis retourne.
On retombe alors dans la deuxième méthode qui attend sur cond2.
Si c'est la première méthode qui fait un unlock(cond2) juste après sa section critique cond1, on obtient un joli deadlock d'ou il est impossible de sortir.
La seule solution que nous avons trouvé ou en tout cas imaginé avec mon collègue c'est d'implémenter une mini gestion de contexte nous permettant de faire du switching de contexte et ainsi relancer la première méthode sans que la deuxième ne se soit terminée.
D'ou mes questions :
- Est ce que quelqu'un a déjà essayé de faire du switching de contexte et pourrais nous donner des pistes de où chercher ?
-Est ce que c'est à ce point compliquer pour que personne n'en parle ?
- Est ce que quelqu'un connait une bonne doc sur le sujet ? (je sais google est mon ami... ben pas vraiment en fait... parce que ca fait une bonne heure que je cherche et à part des définitions de "switching contexte" y a pas grand chose)
-Est ce que quelqu'un à un début d'idée génial permettant d'éviter le switching ?
-Est ce que je ferais mieux de me pendre tout de suite ?
-Est ce que quelqu'un a compris ce post vraiment pas clair ?
Voilà... euh.. toutes les réponses sont bienvenues évidemment...
Je vous remercie déjà pour avoir lu et je vous remercie d'avance pour vos réponses...
Partager