[SOLVED] Zugriff auf Container mit mehreren Threads



  • Hallo zusammen,

    bisher habe ich den Zugriff auf einen vector mit mehreren Threads etwa
    so verwaltet:

    #include<vector>
    #include<boost/thread/mutex.hpp>
    
    class Foo{};
    
    std::vector<Foo*> vec;
    boost::mutex mutex;
    
    void doSomething() {
            //...
            {
                    boost::mutex::scoped_lock l(mutex);
                    vec.push_back(new Foo);
            }
    
    }
    

    Obwohl mir mit dieser Vorgehensweise bisher keinerlei Probleme aufgefallen sind,
    ist es streng genommen wegen möglichem Cachen von Daten und Änderung
    der Befehlsreihenfolge nicht sicher.

    Wie kann ich dieses Fragment ändern, damit es wirklich sicher ist?
    Verwendet ihr in so einem Fall einen boost-Container (z.B. aus Interprocess)?

    Gruß,
    XSpille



  • Welche Änderung der Befehlsreihenfolge?



  • h??? schrieb:

    Welche Änderung der Befehlsreihenfolge?

    Wenn ich nochmal drüber nachdenke, wird dies wohl nicht passieren,
    da das unlock des Mutexes (wahrscheinlich) volatile ist.

    Um meine generellen Bedenken nur noch einmal theoretisch zu erläutern:

    Intern können einzelne Befehle vertauscht werden, so dass bei einer
    Ausführung in einem einzelnen Thread kein Unterschied erkennbar ist.

    Als theoretisches Beispiel:
    Der Vektor ist voll und deswegen muss der interne Speicher neu alloziiert
    werden und der Verweis auf diesen Bereich aktualisiert werden.

    Jetzt kann das unlocken des Mutex vor die letzte Zuweisung verschoben
    werden, falls im singlethreaded Fall kein Unterschied zu merken ist.

    Somit könnte der Zeiger noch ins Nirvana zeigen.



  • Ein Mutex stellt sicher, dass die von dir geschilderten Dinge nicht eintreten. Daran dürfte auch eine RAII-konforme Kapselung nichts ändern.

    volatile hat nichts mit Threads zu tun.



  • manni66 schrieb:

    Ein Mutex stellt sicher, dass die von dir geschilderten Dinge nicht eintreten.

    Ein Mutex garantiert mir auch , dass alle gecachten Werte neu aus dem Arbeitsspeicher
    neu ausgelesen werden?

    manni66 schrieb:

    volatile hat nichts mit Threads zu tun.

    Dessen bin ich mir bewusst.

    Cool...
    Und ich dachte, ich hab immer nur "halb"-sicher geproggt ^^



  • XSpille schrieb:

    manni66 schrieb:

    Ein Mutex stellt sicher, dass die von dir geschilderten Dinge nicht eintreten.

    Ein Mutex garantiert mir auch , dass alle gecachten Werte neu aus dem Arbeitsspeicher
    neu ausgelesen werden?

    Alle Variablenwerte, die du in einem Thread direkt nach einem Mutexunlock sehen kannst, sind in einem anderen Thread nach einem Lock des gleichen Mutex sichtbar.



  • manni66 schrieb:

    Alle Variablenwerte, die du in einem Thread direkt nach einem Mutexunlock sehen kannst, sind in einem anderen Thread nach einem Lock des gleichen Mutex sichtbar.

    Danke manni66!!!



  • Reicht die Verwendung eines Mutexes wirklich aus?


Anmelden zum Antworten