variable et thread safe

variable et thread safe - C++ - Programmation

Marsh Posté le 05-06-2009 à 17:53:04    

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
Reply

Marsh Posté le 05-06-2009 à 17:53:04   

Reply

Marsh Posté le 05-06-2009 à 18:53:29    

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
Reply

Marsh Posté le 05-06-2009 à 19:20:11    

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

Reply

Marsh Posté le 05-06-2009 à 19:54:02    

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

Reply

Marsh Posté le 05-06-2009 à 21:02:31    

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

Reply

Marsh Posté le 05-06-2009 à 21:37:18    

[: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

Reply

Marsh Posté le 05-06-2009 à 21:40:43    

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

Reply

Marsh Posté le 05-06-2009 à 21:53:48    

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 ...

Reply

Marsh Posté le 05-06-2009 à 22:07:19    

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

Reply

Marsh Posté le 05-06-2009 à 22:10:17    

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:

Reply

Marsh Posté le 05-06-2009 à 22:10:17   

Reply

Marsh Posté le 06-06-2009 à 00:15:03    

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
Reply

Marsh Posté le 06-06-2009 à 00:32:05    

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
Reply

Marsh Posté le 06-06-2009 à 01:34:31    

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
Reply

Marsh Posté le 06-06-2009 à 01:52:23    

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.

Reply

Marsh Posté le 06-06-2009 à 01:58:07    

Reply

Marsh Posté le 06-06-2009 à 01:58:57    

 


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
Reply

Marsh Posté le 06-06-2009 à 02:00:12    

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
Reply

Marsh Posté le 06-06-2009 à 08:06:45    

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
Reply

Marsh Posté le 06-06-2009 à 12:53:46    

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
Reply

Marsh Posté le 06-06-2009 à 13:15:47    

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

Reply

Marsh Posté le 06-06-2009 à 14:24:33    

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.

Reply

Marsh Posté le 06-06-2009 à 14:36:11    

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

Reply

Marsh Posté le 06-06-2009 à 15:44:53    

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

Reply

Marsh Posté le 06-06-2009 à 16:06:26    

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

Reply

Marsh Posté le 06-06-2009 à 16:12:31    

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

Reply

Marsh Posté le 06-06-2009 à 20:28:43    

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
Reply

Marsh Posté le 06-06-2009 à 20:32:48    

ça va on a compris

Reply

Marsh Posté le 06-06-2009 à 20:33:57    

Glock 17Pro a écrit :

ça va on a compris


dézolay faut pas se vexer :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed