Bonjour,
Je me pose une question sur la possibilité d'un double appel d'une méthode qui supprime un élément dans une liste.
La situation est la suivante. J'ai des sons qui sont joués par la SDL. Chaque son est lancé par un gestionnaire commun qui garde un pointeur sur le son dans une liste. Quand l'un d'eux se termine, un callback prévient le gestionnaire de son, qui le supprime de sa liste. J'imagine que si un son se termine pendant que je suis en train de supprimer le précédent de la liste, je peux avoir un problème.
Ci-dessous, la situation en code.
J'ajoute qu'il n'y a que la lecture des sons qui utilise un autre thread et pour lesquels je ne contrôle pas l'évolution. Tout le reste du programme est parfaitement séquentiel.
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
19
20
21
22
23
24
25 void gestionnaire::lire( const std::string& n ) { // ici on garde un pointeur sur le son lu sample* s = new sample(n); m_samples.push_back(s); // std::list<sample*> s->lire(); } void gestionnaire::sample_fini( sample* s ) { std::list<sample*>::iterator it=m_samples.begin(); bool ok(false); while ( !ok && (it!=m_samples.end()) ) if ( *it == s ) { ok = true; // si un autre sample s'est terminé, a appelé cette fonction et en est à la même // position que "it" dans sa boucle, il va être déçu après cette suppression. m_samples.erase(it); } else ++it; }
Comme indiqué dans le commentaire, si deux sons se terminent en même temps, ils vont appeler manager::sample_fini(). Je ne sais pas alors ce qui va se passer. Est-ce que le fait que le programme soit dans un seul thread fait que les deux appels vont se faire séquentiellement, ou est-ce que le fait que les sons soient dans des threads différents fait que les deux appels vont se faire en parallèle ?
Dans le doute, je suppose que c'est le second cas. Quelles sont alors les solutions pour éviter les problèmes ?
Je pensais déclarer une variable "boost::mutex fini_mutex;" au début de manager::sample_fini(), mais comme je ne suis pas familier avec la programmation multi-thread, je voudrais avoir confirmation que ça va bien empêcher deux appels parallèles de la méthode (et que c'est une solution correcte pour ce problème).
Merci
Partager