OpenMP und Threadsicherheit im Code



  • Hallo,

    bin heute auf MCSTL gestoßen, eine STL Implementierung, welche Parallelität durch OpenMP umsetzt.
    Wir haben schon bestehen den Code (sehr viel sogar), und dieser ist nicht für OpenMP oder wirkliche Threadsicherheit ausgelegt.
    Mich interessiert jetzt vor allem, wie sich das mit den comparator klassen verhält, welche bei uns häufig so aussehen:

    class CompA: public std::binary_function<const ClassA*, const ClassA*, bool>
        {
          public :
          virtual bool operator()( const ClassA* p1, const ClassA* p2 ) const 
          { 
            const Param & a= p1->getParam(); 
            const Param & b= p2->getParam(); 
    
            return a.getValue() < b.getValue();
          }
        };
    

    Kann solcher Code mit OpenMP Probleme machen?
    Gerade wenn Instanzen auch in mehreren Containern als Pointer liegen. (was nicht auszuschließen wäre).

    Die Codebasis ist relativ groß, und nicht immer sofort durchschaubar. Mutexe oder ähnliches gibt es für Instanzen nicht.



  • Wenn die getter keine Nebeneffekte haben sollte das kein Problem sein, IMO.



  • Blue-Tiger schrieb:

    Wenn die getter keine Nebeneffekte haben sollte das kein Problem sein, IMO.

    Naja, ich sehe halt da auch die Möglichkeit von DB Zugriffen etc. Werde das wohl von Fall zu fall abklären müssen.



  • Blue-Tiger schrieb:

    Wenn die getter keine Nebeneffekte haben sollte das kein Problem sein, IMO.

    Die getter müssen threadsafe sein.

    keine Nebeneffekte != threadsafe



  • Also bei einer generellen Durchsicht bin ich jetzt auf einige Dinge gestossen.
    So ist zum Beispiel atoi nicht threadsafe, auch andere C Funktionen muss ich da noch mal genauer abchecken. Das reine Getter Threadsafe sind, ist klar, aber hier gibt es halt noch reichlich anderen Code, welcher hinter den Comparatoren ausgeführt wird.

    Am meisten Sorge macht mir zur Zeit diese Methode:

    void* HASHTABLE::get( const unsigned long Key ) const
    {
      HDRDSC *bucket; /* Zeiger auf die Kopfbeschreibung       */
      char *pkey = (char*)&Key;
      for (bucket= hash[ MAKE_HASH(pkey, lhsht)]; bucket; bucket= bucket->next)
        if (Key == (bucket->ident))
          return bucket->object;
      return 0;
    }
    

    Wäre das immer noch Threadsicher? Das einzige was hier gesetzt wird, liegt auf dem Methoden Stack, was geschieht wenn 2 Threads nun eine Liste Sortieren, welche aus Objekten aus dem HashTable zusammengesetzt ist?



  • Und was, wenn die Hashtable aus einem anderen Thread geaendert wird ...



  • Das kann ich wohl größtenteils Ausschließen.

    Allerdings stelle ich mir auch jetzt die Frage, ob sich Multithreaded Sorting überhaupt lohnt, wenn ein Großteil der Listen wohl < 1000 Einträge hat (evtl. sogar unter 100).

    Eine Threadpool Lib habe ich dafür schon, welche auch die "Solaris8" Anforderung erfüllt.


Anmelden zum Antworten