Bonjour !
Je cherche a faire un graphe dans un environnement extrêmement multithreadé. Les nodes du graphe doivent pouvoir être liés, c'est a dire que les deux nodes du lien stockent un pointeur vers l'autre élément. Je veux le rendre thread safe dans le sens où n'importe quel thread peut appeler link() avec n'importe quelle instance. Plusieurs thread peuvent le faire en même temps.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A
{
     A* m_link
     Mutex m_mutex;
public:
     bool link(A* p_other)
     {
          //checks
          if(!p_other) return false; //No link to null pointer
          if(m_link) return false; //Already linked
          //Lock mutexes
          Lock l1(p_other->m_mutex);
          if(p_other->m_link) return false; //p_other already linked
          Lock l2(m_mutex);
          //Link
          m_link = p_other;
          p_other->m_link=this;
          return true;
     }
};
Avec cette implémentation cependant, je cours le risque de gros deadlocks. Je me demandais s'il existait une solution à ce problème, ou s'il s'agit d'un problème de design.