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

4 réponses

1 2
Avatar
kanze
Bruno Causse wrote:
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]));

}


Encore : dans quelle contexte ? Si un autre thread peut modifier
move, tu n'es sûr de rien. Si aucune autre thread modifie move,
ou que tu as une synchronisation externe qui protège tous les
accès, ça marche.

(En passant, est-ce que le paramètre ne doit pas être COsMove
const&.)

--
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
Fabien LE LEZ wrote:
On Mon, 26 Dec 2005 12:49:33 +0100,
(Bruno Causse):


[...]
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]);
}


Et encore.

Que fait la fonction ? Elle renvoie une chaîne. C'est
l'«@action@» principale, qui s'effectue dans tous les cas. Le
return ne doit donc pas se trouver dans un « if ».
(Indépendamment du fait que d'avoir plusieurs return rend le
code vite illisible.)


return move.fPass
? std::string( "PA" )
: std::string( 1, "ABCDEFGH"[ move.coll ] )
+ std::string( 1, "12345678"[ move.row ] ) ;

Au moins que je n'aie prégénéré toutes les réponses possibles
dans un tableau, et que j'écrive simplement :

return move.fPass
? passString
: positionString[ move.coll ][ move.row ] ;

La prégénération peut poser un problème d'ordre
d'initialisation, mais je doute que ce soit un problème ici. La
prégénération dépend aussi des garanties données par la classe
std::string -- dans le cas de g++, par exemple, il faut une
synchronisation externe (mais dans la pratique, ça marchera dans
ce cas-ci, même si ce n'est pas garantie selon la
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
Bruno Jouhier
Est-ce que tu pourrais t'expliquais ? À commencer par ce que tu
entends par la VM.


Manifestement, la fonction de rappel de message ne fonctionne pas sur ce NG.
J'avais posté en croyant être sur le fr.com.lang.java, et je me suis ensuite
rendu compte que c'était le NG C++. J'ai annulé le message immédiatement
mais ça n'a pas l'air d'avoir fonctionné.

Bruno.

Avatar
Fabien LE LEZ
On Tue, 27 Dec 2005 13:47:37 +0100, "Bruno Jouhier"
:

J'ai annulé le message immédiatement
mais ça n'a pas l'air d'avoir fonctionné.


Ça varie suivant les serveurs : si jamais ton Cancel est arrivé un peu
tard, le message d'origine a eu le temps de se propager -- et certains
serveurs refusent les Cancel.

1 2