Problème de conception avec les mutex de Boost
Bonjour à tous,
Je fais évoluer une application multi-threadée exploitant les threads de Boost. Initialement, cette application exploitait les threads de la librairie wx::widget.
Mon soucis de conception est le suivant:
Je dispose d'une classe A et d'une classe B. Les méthodes de ma classe A appellent des getteurs de la classe B.
Depuis un thread, dans une méthode de la classe A, j'appelle successivement plusieurs getteurs d'une instance de la classe B, potentiellement modifiée dans un autre thread. J'utilise donc un mutex pour éviter que l'un des attributs de la classe B ne soit modifiés lors de l'appel de son accesseur par la classe A. Actuellement, ce mutex est encapsulé dans un classe verrou. Cependant, ma modélisation ne semble pas compatible avec le design pattern "Scope Locking"
de boost. Schématiquement mon code est le suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class A{
private:
B b;
int ia;
int ja;
public:
void maj(){
b.bloquerMaj();
ia = b.getIB();
ja = b.getJB();
b.debloquerMaj();
}
}; |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| class B{
private:
int ib;
int jb;
Verrou verrou;
public:
int getIB(){
return ib;
}
int getJB(){
return jb;
}
void setIB(int ib){
this->ib = ib;
}
void setJB(int jb){
this->jb = jb;
}
void bloquerMaj(){
verrou.lock();
}
void debloquerMaj(){
verrou.unlock();
}
}; |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Verrou{
private:
wxMutex mutex;
public:
/** Prise du verrou. */
virtual void lock(){
mutex.Lock();
}
/** Relachement du verrou. */
virtual void unlock(){
mutex.Unlock();
}
} |
Mon impératif est de garder ma classe Verrou en la faisant exploiter les mutex de Boost, bien que je ne vois pas comment faire...
Toute suggestion est la bienvenue,
Cordialement.