Bonjour,
Je travaille actuellement sur une application qui est chargée en tant que "plugin" au sein d'une application "hôte".
Mon plugin se compose d'une hiérarchie d'objets "métier", éditée par une IHM qui tourne dans son propre thread.
En gros, ma hiérarchie ressemble à ça (elle est créée par l'utilisateur qui y ajoute des objets) :
Ensuite, le logiciel "hôte" utilise un thread qui vient parcourir l'ensemble de cette hiérarchie pour en sortir des données. Ce thread doit être "prioritaire" sur le thread GUI car le traitement a lieu pratiquement en temps réel.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 -- Session | |-- Groupe 1 | | | |-- Objet 1.1 | |-- Objet 1.2 | | | |-- Composant 1.2.1 | |-- Composant 1.2.2 | |-- Groupe 2 | | | |-- Objet 2.1 | | | | | |-- Composant 2.1.1 | | |-- Composant 2.1.2 | | | |-- Objet 2.2
Vu que l'utilisateur (le thread IHM) peut modifier la hiérarchie ou les propriétés d'un objet pendant que le thread de calcul tourne, faut synchroniser tout ça.
(le thread de calcul ne fait que "lire" les données, le thread IHM les lit et les écrit)
Quelle serait selon vous la meilleure méthode (en terme de performances), sachant que le thread de calcul exécute son code de traitement de la hiérarchie toutes les 10-20 ms environ ?
J'ai pensé à ça :
1. utiliser un mutex (et un seul) pour bloquer toute la hiérarchie.
- par le thread de calcul : locké à chaque fois qu'il commence à lire la hiérarchie / libéré quand il a finit
- par le thread d'IHM : locké/libéré à chaque fois qu'il traite un évènement (on bloque sa boucle de messages)
=> facile, seuls 2 endroits où mettre les lock, et peut de risque de bugs inter-thread
=> je crains de faire attendre longtemps le thread de calcul si le thread GUI est occupé (a faire un gros redraw ou une opération disque par exemple)
2. utiliser un mutex par objet de la hiérarchie
- par le thread de calcul : locké/libéré à chaque fois qu'il lit cet objet en particulier
- par le thread d'IHM : locké/libéré à chaque fois qu'il lit/écrit cet objet en particulier
=> on ne risque plus d'attendre trop longtemps, car les opérations lockées sont beaucoup plus "atomiques"
=> je crains que cela fasse beaucoup de "lock/unlock" inutiles (la hiérarchie est potentiellement grosse, quelques centaines d'objets) et beaucoup de mutex
3. un mix des deux : un seul mutex
- par le thread de calcul : locké à chaque fois qu'il commence à lire la hiérarchie / libéré quand il a finit
- par le thread d'IHM : locké à chaque début de modif d'un objet / libéré à la fin
=> on risque de faire attendre l'IHM un peu (mais c'est pas grave)
=> le thread de calcul ne risque pas d'attendre trop longtemps
=> cette solution me parait la meilleure, mais ça veut dire poser des lock/unlock dans chaque fonction du thread d'IHM qui édite les objets
=> y'en a beaucoup, je crains d'en oublier et de voir apparaître un bug incompréhensible de temps à autre à cause d'un soucis de synchro
Tous vos conseils seront les bienvenus !
Partager