OVH Cloud OVH Cloud

methode de classe et multithread

14 réponses
Avatar
pasde.hcyrano.spam
bonjour,

une methode de classe qui ne modifie que ses variables locales est elle
thread safe?

par ex :

MaClass {
static int b[100];
static int maMethodeStatic(int a);
};

int MaClass::maMethodeStatic(int a) {
int c = a - 4;
return c*7+ b[a];
}

mon intuition me dit que c'est le bazar
--
Bruno Causse
http://perso.wanadoo.fr/othello

10 réponses

1 2
Avatar
Fabien LE LEZ
On Mon, 26 Dec 2005 10:26:03 +0100, (Bruno
Causse):

une methode de classe qui ne modifie que ses variables locales est elle
thread safe?


Ben non...

int MaClass::maMethodeStatic(int a) {
int c = a - 4;
return c*7+ b[a];


Ici, une autre fonction peut modifier b[a] en même temps.

Avatar
pasde.hcyrano.spam
Fabien LE LEZ wrote:

Ici, une autre fonction peut modifier b[a] en même temps.
je ne pensais pas a ca (b est const en realité)


mais si un deuxieme objet appele la methode pendant q'un autre l'
utilise partagent t'ils le meme a et c?

--
Bruno Causse
http://perso.wanadoo.fr/othello

Avatar
Bruno Jouhier
"Bruno Causse" a écrit dans le message de news:
1h86gmc.y5hu8u3ops3cN%
Fabien LE LEZ wrote:

Ici, une autre fonction peut modifier b[a] en même temps.
je ne pensais pas a ca (b est const en realité)


mais si un deuxieme objet appele la methode pendant q'un autre l'
utilise partagent t'ils le meme a et c?


Non. Chaque thread a sa propre pile pour les variables locales et le passage
de paramètres. Pas de risque d'interférences ici.

Si b est const, ce code est parfaitement sûr.

Si b ne l'est pas, ça reste en fait thread safe car tu as un seul accès à
b[a] dans ta méthode et car les types manipulés (référence sur le tableau et
int) sont gérés de manière atomique par la VM. Si tu utilisais 2 fois b[a]
dans ta méthode, ça ne serait plus thread safe il y aurait un risque de
modif de b[a] en cours de méthode, et donc un comportement non déterministe.

Bruno


--
Bruno Causse
http://perso.wanadoo.fr/othello



Avatar
pasde.hcyrano.spam
Bruno Causse wrote:

Fabien LE LEZ wrote:

Ici, une autre fonction peut modifier b[a] en même temps.
je ne pensais pas a ca (b est const en realité)


mais si un deuxieme objet appele la methode pendant q'un autre l'
utilise partagent t'ils le meme a et c?


je pense a ce type de methode static

std::string RXMove::COsMove_to_coord(COsMove& move) {

if (move.fPass)
return std::string("PA");

return (std::string(1, "ABCDEFGH"[move.col]) +
std::string(1, "12345678"[move.row]));

}

--
Bruno Causse
http://perso.wanadoo.fr/othello


Avatar
Fabien LE LEZ
On Mon, 26 Dec 2005 12:49:33 +0100, (Bruno
Causse):

mais si un deuxieme objet appele la methode pendant q'un autre l'
utilise partagent t'ils le meme a et c?


Dans le code

int MaClass::maMethodeStatic(int a) {
int c = a - 4;


les objets a et c sont des variables automatiques locales, donc il n'y
a aucun partage avec une autre instance de la fonction.

À 15:04:49 tu as continué :

std::string RXMove::COsMove_to_coord(COsMove& move) {


Là c'est plus compliqué, puisque l'objet est passé par référence.
D'ailleurs, il me semble qu'il y a un bug : il devrait s'agir d'une
référence const.

if (move.fPass)
return std::string("PA");

return (std::string(1, "ABCDEFGH"[move.col]) +
std::string(1, "12345678"[move.row]));


Note en passant : j'aurais tendance à préférer le style ci-dessous :

if (move.fPass)
{
return std::string("PA");
}
else
{
return std::string(1, "ABCDEFGH"[move.col])
+ std::string(1, "12345678"[move.row]);
}

A priori, comme cette fonction ne modifie rien, si std::string est
thread-safe, la fonction l'est aussi, i.e. tu peux appeler plusieurs
fois cette fonction avec le même paramètre en même temps.
Toutefois, si l'objet passé en argument par référence est modifié en
même temps par une autre fonction, ce n'est plus thread-safe.

Avatar
pasde.hcyrano.spam
Fabien LE LEZ wrote:

les objets a et c sont des variables automatiques locales, donc il n'y
a aucun partage avec une autre instance de la fonction.


donc si j'ai bien compris

les variables automatiques sont crées a chaque appel de la methode meme
si un autre appel est en cour (autre thread).

une ref est aussi une variable auto donc deux objets COsMove (const)
peuvent acceder en meme temps a la methode.


merci
--
Bruno Causse
http://perso.wanadoo.fr/othello

Avatar
Fabien LE LEZ
On Mon, 26 Dec 2005 17:42:17 +0100, (Bruno
Causse):

une ref est aussi une variable auto donc deux objets COsMove (const)


Tu deviens totalement illisible, là :-(

Prends donc le temps de formuler correctement tes idées, en français
si possible.

Avatar
pasde.hcyrano.spam
Fabien LE LEZ wrote:

Tu deviens totalement illisible, là :-(

Prends donc le temps de formuler correctement tes idées, en français
si possible.


désolé,

--
Bruno Causse
http://perso.wanadoo.fr/othello

Avatar
kanze
Bruno Causse wrote:

une methode de classe qui ne modifie que ses variables locales
est elle thread safe?

par ex :

MaClass {
static int b[100];
static int maMethodeStatic(int a);
};

int MaClass::maMethodeStatic(int a) {
int c = a - 4;
return c*7+ b[a];
}

mon intuition me dit que c'est le bazar


Je ne comprends pas la question ? Qu'entends-tu par « thread
safe » ici ?

Normallement, si une fonction a été conçue pour être utilisée
dans un environement multi-thread, elle documente ce qu'il lui
faut. Si elle est conforme à la documentation, elle est « thread
safe ». Si elle n'est pas conforme, OU qu'il n'y a pas de
documentation, elle ne l'est pas. Mais parler de la « thread
safety » d'une fonction en isolation, sans citer les garanties
documentées qu'elle donne, n'a pas de sens. La « thread safety »
ne se traite pas au niveau des fonctions isolées, mais à un
niveau plus haut ; tout ce qu'on peut démander à une fonction
isolée, c'est qu'elle respecte sa documentation.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
kanze
Bruno Jouhier wrote:
"Bruno Causse" a écrit dans le
message de news:
1h86gmc.y5hu8u3ops3cN%

Fabien LE LEZ wrote:

Ici, une autre fonction peut modifier b[a] en même temps.
je ne pensais pas a ca (b est const en realité)


mais si un deuxieme objet appele la methode pendant q'un
autre l' utilise partagent t'ils le meme a et c?


Non. Chaque thread a sa propre pile pour les variables locales
et le passage de paramètres. Pas de risque d'interférences
ici.

Si b est const, ce code est parfaitement sûr.

Si b ne l'est pas, ça reste en fait thread safe car tu as un
seul accès à b[a] dans ta méthode et car les types manipulés
(référence sur le tableau et int) sont gérés de manière
atomique par la VM.


Est-ce que tu pourrais t'expliquais ? À commencer par ce que tu
entends par la VM.

En tout cas, la norme Posix dit que c'est un comportement
indéfini si un thread modifie un objet, et qu'on l'accède depuis
un autre thread, quelque soit le type d'accès dans l'autre
thread.

Si tu utilisais 2 fois b[a] dans ta méthode, ça ne serait plus
thread safe il y aurait un risque de modif de b[a] en cours de
méthode, et donc un comportement non déterministe.


Tout dépend de la plateforme, naturellement, mais selon Posix,
dès qu'un objet sert dans plus d'un thread, et qu'au moins un
thread le modifie, il faut que tous les accès, dans tous les
threads, soient synchronisés. Autant que je sache, Windows ne
garantit pas plus.

Note aussi que l'atomicité n'est qu'un des problèmes potentiels.
(Et que l'atomicité de l'accès à un int n'est pas garantie sur
certaines architectures, comme Intel 32 bits.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



1 2