accès simultané à la même méthode d'un même objet par des threads
Bonjour,
je voudrais vérifier une information, mais je n'ai pas trouvé ce que je voulais sur le net (j'ai surtout trouvé du Java :cry:).
Si vous pouviez me dire si ce que je dis ci-dessous est vrai ou non, ça me débloquerait!
L'information que je voudrais vérifier est
Citation:
2 threads peuvent appeler la même méthode d'un même objet sans problème mais il il peut y avoir un problème si les méthodes font un accès concurent à un attribut de l'objet alors qu'il n'est pas protégé.
Par exemple, une méthode std::cout << "hello world"; ne posera pas de problème si 2 threads appellent simultanément cette méthode sur un même objet.
Par contre, le code suivant posera problème
Code:
1 2 3
| int res = AttributNombreAppelMethode; // AttributNombreAppelMethode est un attribut de l'objet qui compte le nombre de fois où sa méthode a été appelée
std::cout << "le nombre d'appel de cette méthode est " << res;
AttributNombreAppelMethode= res + 1; |
Si 2 threads appellent cette méthode sur un même objet, on aura
1er thread ////////// 2ème thread
res = 0;
//////////////////////// res = 0;
AttributNombreAppelMethode = 1;
//////////////////////// AttributNombreAppelMethode = 1; // au lieu de 2
En plus des problèmes de cohérence des valeurs, il peut y avoir des problèmes si les threads écrivent en même temps dans attribut de grande taille, puisque l'attribut sera composé à la fin d'un mélange de ce que les 2 threads ont mis.
Une méthode qui peut être appelée simultanément sur le même objet sans poser de problèmes:
Code:
1 2 3 4 5
| LockMutex(); // prend le mutex
int res = AttributNombreAppelMethode;
AttributNombreAppelMethode++;
UnlockMutex(); // rend le mutex
std::cout << "le nombre d'appel de cette méthode est " << res; |
Je ne suis pas sûr du tout de ce que je viens de dire.
Est ce que quelqu'un pourrait me dire ce qu'il en pense, svp?
Merci d'avance!