Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1521 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  variable et thread safe

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

variable et thread safe

n°1891774
Glock 17Pr​o
Posté le 05-06-2009 à 17:53:04  profilanswer
 

hello,
 
Question multi threading.
 
Comment puis-je faire pour limiter le r/w d'une variable à une seul thread ?
 
je connais juste la technique pour locker un bout de code :
 
lock()
...//code
unlock()
 
mais comment faire pour qu'une variable d'une classe utilisée dans une fonction ne puisse pas être utilisée en même temps dans une autre fonction de la classe.
 
par exemple :
 
lock()
void f1(){
...//var1...
}
unlock()
 
lock()
void f2(){
...//var1=...
}
unlock()
 
=> Un Thread accède à f1 et un autre à f2, potentiellement
var1 peut être r/w en même temps à deux endroits différents, donc problème
 
 
 
Merci!


Message édité par Glock 17Pro le 05-06-2009 à 18:33:42
mood
Publicité
Posté le 05-06-2009 à 17:53:04  profilanswer
 

n°1891785
theshockwa​ve
I work at a firm named Koslow
Posté le 05-06-2009 à 18:53:29  profilanswer
 

Pour l'instant, tu ne trouveras rien de standard en C++ pour répondre à ta demande.
 
Maintenant, tu peux te documenter sur les mutex et regarder l'api de ton OS, ou alors jeter un oeil à ce que propose boost sur le sujet.


---------------
last.fm
n°1891792
Joel F
Real men use unique_ptr
Posté le 05-06-2009 à 19:20:11  profilanswer
 

boost::mutex et boost::semaphore
Et lire un Tanenbaum :o

n°1891797
Glock 17Pr​o
Posté le 05-06-2009 à 19:54:02  profilanswer
 

boost::mutex ça sait faire ça ? locké un membre donnée d'une classe ?

n°1891817
Glock 17Pr​o
Posté le 05-06-2009 à 21:02:31  profilanswer
 

C'est stable comme bilbi ? ça évolue pas toutes les 2 semains genre ?

n°1891823
Joel F
Real men use unique_ptr
Posté le 05-06-2009 à 21:37:18  profilanswer
 

[:prozac] ... t'en as d'autres du genre ...  
faudra commencer à comrpendre que Bosot c'ets pas 3 ados boutonneux qui s'en occupent mais des professionels :o

n°1891824
Glock 17Pr​o
Posté le 05-06-2009 à 21:40:43  profilanswer
 

t'es marrant toi, mais on voit partout que la lib fait des modifs tous les 36 du mois

n°1891825
Joel F
Real men use unique_ptr
Posté le 05-06-2009 à 21:53:48  profilanswer
 

les bug fixes ca te dit rien evidemment ...
 
l'interface est stable, les seuls changement sont les correctifs de bug et les nouvelles bibliothèques ...

n°1891829
Glock 17Pr​o
Posté le 05-06-2009 à 22:07:19  profilanswer
 

oui oui à part que par exemple pour boost:mutex, des parties entière de la librairie sont finalement jetés

n°1891831
Joel F
Real men use unique_ptr
Posté le 05-06-2009 à 22:10:17  profilanswer
 

Glock 17Pro a écrit :

oui oui à part que par exemple pour boost:mutex, des parties entière de la librairie sont finalement jetés


Ca date de bien 4 versions le changement d'API de mutex et vu que le précédent était incomplet et peu extensible ca se comprend.
Mias bon je te laisse te chier dessus avec les mutex posix tu verras c'ets super  :sarcastic:

mood
Publicité
Posté le 05-06-2009 à 22:10:17  profilanswer
 

n°1891849
Glock 17Pr​o
Posté le 06-06-2009 à 00:15:03  profilanswer
 

comment faire  pour réussir à avoir dans un objet des fonctions lock/unlock pour bloquer l'accés à cet objet à un seul thread ?

 

Myobjet o;
o.lock()


Message édité par Glock 17Pro le 06-06-2009 à 00:18:19
n°1891859
theshockwa​ve
I work at a firm named Koslow
Posté le 06-06-2009 à 00:32:05  profilanswer
 

on n'est pas en C#
 
En C++, c'est une association logique que tu feras, du style :
 

Code :
  1. Mutex fooMutex;
  2. Foo foo;
  3. // ...
  4. {
  5.   Lock lock(fooMutex);
  6.   // bosser sur foo
  7. }


 
avec la classe Lock qui verrouille le mutex pendant sa durée de vie. Bref, lis la doc de boost, c'est probablement très bien fait.
 
Un petit coup d'oeil m'indique que le lock dont je parle a l'air d'être appelé scoped_lock dans boost, quelqu'un pourra éventuellement confirmer


---------------
last.fm
n°1891877
Glock 17Pr​o
Posté le 06-06-2009 à 01:34:31  profilanswer
 

oui mais là c'est pas le pbm que je cherche à éviter. ça c'est bon c'est compris, ce que je cherche à faire c'est un peu différent..Je voudrais finalement pouvoir locker un objet pas suelement un bout de code...

 

pour qu'un à moment donné, un membre donées, utilisées dans plusieurs fonctions membres justment, ne puisse pas être utilisé pas deux thread simultanément..


Message édité par Glock 17Pro le 06-06-2009 à 01:40:26
n°1891878
bjone
Insert booze to continue
Posté le 06-06-2009 à 01:52:23  profilanswer
 

Bah y'a pas vraiment de solution.
Tu sécurise les primitives qui seront utilisées, y'a pas trop d'autres solutions.
 
Sinon oui theshockwave, scoped_lock est effectivement l'approche dont tu parles.

n°1891880
Glock 17Pr​o
Posté le 06-06-2009 à 01:58:07  profilanswer
 
n°1891883
Glock 17Pr​o
Posté le 06-06-2009 à 01:58:57  profilanswer
 

 


Code :
  1. synchronized<list<int>> sli;
  2.     LOCK (sli) {
  3.         sli.push_back(1);
  4.         sli.push_back(2);
  5.     }
 

je peux peut être adapté pour mon cas


Message édité par Glock 17Pro le 06-06-2009 à 02:03:52
n°1891884
bjone
Insert booze to continue
Posté le 06-06-2009 à 02:00:12  profilanswer
 

Et bien oui tu pourrais encapsuler le tout via une class template qui fait le lock sur les opérations de base. (mais ça pourrait faire un mutex par variable, enfin à voir).
 
Enfin les mutex sur les objets, ça peut etre moyen, enfin à voir, c'est plus dans le flot général de traitement qu'il faut les placer.


Message édité par bjone le 06-06-2009 à 02:12:51
n°1891911
Joel F
Real men use unique_ptr
Posté le 06-06-2009 à 08:06:45  profilanswer
 

locker des objets c'est juste la plus mauvaise façon de faire, on est pas en JAVA quoi :/
Les lock doivent etre le plus atomiques possibles et sont fondamentalement des operations qui ont un sens sur le flot de controle pas sur les données.

 

la macro LOCK ne doit rien faire d'autre que ouvrir un scope, locker un mutex en RAII et fermer son scope.

Message cité 1 fois
Message édité par Joel F le 06-06-2009 à 08:08:20
n°1891945
Glock 17Pr​o
Posté le 06-06-2009 à 12:53:46  profilanswer
 

Joel F a écrit :

locker des objets c'est juste la plus mauvaise façon de faire, on est pas en JAVA quoi :/
Les lock doivent etre le plus atomiques possibles et sont fondamentalement des operations qui ont un sens sur le flot de controle pas sur les données.

 

la macro LOCK ne doit rien faire d'autre que ouvrir un scope, locker un mutex en RAII et fermer son scope.

 

je vois ça me parait pas déconnant ce que tu dis.

 

Dans mon cas, je suis précisemment exposé à ce problème :

 

Une classe log
- une méthode write => accède à un membre donnée de type std::ostringstream
- un thread lancé dans le constructeur de log , qui check si le buffer std::ostringstream est suffisamment rempli est fait un flush

 

Une autre classe qui a Log en membre donnée.
si cette dernière appel la méthode write de son membre donnée de type Log pendant que le thread de ma classe de Log fait un flush, je peux avoir un undefined behavior, dû à l'accés simultanée de mon buffer std::ostringstream, comment puis-je éviter ça ?

 

Là le pbm c'est pas que deux thread accèdes au même code simultanément, c'est bien que des threads accèdent à la même variable en même temps..


Message édité par Glock 17Pro le 06-06-2009 à 14:00:37
n°1891947
Glock 17Pr​o
Posté le 06-06-2009 à 13:15:47  profilanswer
 

il faudrait que dans write je puisse stoppé temporairement le thread qui flush? c'est la seule façon de faire ?

n°1891949
Joel F
Real men use unique_ptr
Posté le 06-06-2009 à 14:24:33  profilanswer
 

bah ilf aut rendre ta methode write 'synchronized' comme en JAVA.
En gros, à l'entrée de la méthode tu lock un mutex associé à ton objet log et tu le delock en sortie. Idem pr la méthode de flush.

n°1891952
Glock 17Pr​o
Posté le 06-06-2009 à 14:36:11  profilanswer
 

mais oui voilà, si j'ai un mutex en membre donnée , que je le lock dans write, flush doit attendre... tout simplement!

n°1891964
Joel F
Real men use unique_ptr
Posté le 06-06-2009 à 15:44:53  profilanswer
 

je vosi pas comment tu peut faire autrement hein [:dawa]
goto lire Tanenbaum

n°1891970
Glock 17Pr​o
Posté le 06-06-2009 à 16:06:26  profilanswer
 

la vérité j'avais pas pris conscience qu'un un lock dans une méthode en plus de locker le bout de code, empêche un autre lock de locker le même mutex... et c'est pil poil ça qu'il me fallait

n°1891972
Joel F
Real men use unique_ptr
Posté le 06-06-2009 à 16:12:31  profilanswer
 

tu lock jamais de code, tu lock le mutex.
le mutex c'est le videur de boite de nuit, quand il tu rentres pas, tu rentres pas :o

n°1892037
bjone
Insert booze to continue
Posté le 06-06-2009 à 20:28:43  profilanswer
 

Glock 17Pro a écrit :

la vérité j'avais pas pris conscience qu'un un lock dans une méthode en plus de locker le bout de code, empêche un autre lock de locker le même mutex... et c'est pil poil ça qu'il me fallait


 
bin c'est un peu la définition du mutex/sémaphore :??:


Message édité par bjone le 06-06-2009 à 20:28:54
n°1892039
Glock 17Pr​o
Posté le 06-06-2009 à 20:32:48  profilanswer
 

ça va on a compris

n°1892040
bjone
Insert booze to continue
Posté le 06-06-2009 à 20:33:57  profilanswer
 

Glock 17Pro a écrit :

ça va on a compris


dézolay faut pas se vexer :)

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  variable et thread safe

 

Sujets relatifs
Une variable qui prend un peu trop de place ...variable global dans un include, unique dans l'appli ?
addition de variable texte - erreurConnaitre le type d'une variable dans un if en asp
[Résolu][Javascript]Boucle de test et définition de variable.[javascript] variable dynamique ?
Reformater une variable date[C#] changer texte label avec conflit de thread
Acceder à un tableau via une seule variable via un pointeur?Multi Thread
Plus de sujets relatifs à : variable et thread safe


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR