2016-07-13 13 views
-1

Ich habe eine Karte wie diesestd :: Kartenlesen, während in einem separaten Thread Einfügen

map<string,A> 

Nun, wenn ich durch die Karte von Thread Ich bin Iterieren, Faden II auf, um es etwas einfügen. Beeinflusst diese Insertion das Lesen?

+0

Ja zu machen. In einem Wort. Sie könnten mit einer std :: list durchkommen, weil das Einfügen die Iteratoren nicht ungültig macht, aber ich sehe immer noch eine Chance für Probleme. Thread-sichere Warteschlangen suchen? – doctorlove

+0

@doctorlove std :: map macht keine Iteratoren mehr ungültig als std :: list. Keine von ihnen sind Thread-sicher. – user2079303

Antwort

4

Ja, der Einsatz kann den Messwert beeinflussen. Der Standard bietet keine Garantie für die Gewindel sicherheit. Es gibt eine Race Condition, die zu undefiniertem Verhalten führt.

+0

Eine Wettlaufbedingung ** immer ** führt zu undefiniertem Verhalten. –

+0

Wie wirkt sich das Einfügen auf das Lesen aus? Pro [this] (http://stackoverflow.com/a/6442829/4342498) Einfügung betrifft kein anderes Element. – NathanOliver

+0

@NathanOliver Obwohl die Antwort dies nicht explizit sagt, beschreibt sie die * post-Bedingungen * der Operationen. Technisch gesehen gelten Post-Bedingungen erst, wenn die Operation zurückgegeben wurde. Das Problem ist nicht nur die Gültigkeit von Referenzen. Die "Karte" kann während des Einfügens in einem inkonsistenten Zustand sein. – user2079303

0

Ja, es wird den Messwert beeinflussen. Sie benötigen einen zusätzlichen Synchronisationsmechanismus zwischen diesen beiden Threads. Lesen Sie über std::mutex und std::unique_lock.

Siehe folgende Beispielcode:

#include <map> 
#include <string> 
#include <mutex> 
#include <memory> 

class MapWithMutex 
{ 
public: 
    int readFromMap(const std::string& key) 
    { 
     std::unique_lock<std::mutex>(mtx); 
     //add some check if elements exists 
     return myMap[key]; 
    } 
    void insertToMap(const std::string& key, int value) 
    { 
     //add check if element doesn't already exist 
     std::unique_lock<std::mutex>(mtx); 
     myMap[key] = value; 
    } 
private: 
    std::map<std::string,int> myMap; 
    std::mutex mtx; 
}; 

int main() { 
    MapWithMutex thSafeMap; 
    //pass thSafeMap object to threads 
    return 0; 
} 

Denken Sie daran, kritischen Abschnitt so klein wie möglich

Verwandte Themen