In C++ gibt es eine Möglichkeit, sperren das Objekt selbst?

Habe ich eine stl-map, die ich sein möchte, synchronisiert über mehrere threads. Derzeit habe ich...

Funktion (Modifiziert Karte)

void Modify(std::string value)
{
    pthread_mutex_lock(&map_mutex);

    my_map[value] = value;

    pthread_mutex_unlock(&map_mutex);
}

Funktion B (Liest Karte)

std::string Read(std::string key)
{
    std::string value;

    pthread_mutex_lock(&map_mutex);

    std::map<std::string, std::string>::iterator it = my_map.find(key);

    pthread_mutex_unlock(&map_mutex);

    if(it != my_map.end())
    {
        return it->second;
    }
    else
    {
        return "DNE";
    }
}

Dies ist synchronisiert über alle threads, aufgrund des mutex. Allerdings habe ich zum sperren der mutex-Funktion B, obwohl es nicht ändern die Karte überhaupt. Gibt es eine Möglichkeit um es zu sperren my_map Objekt selbst in Eine Funktion, und nicht lock-in-Funktion B, während thread-Synchronisation. Auf diese Weise werden alle Instanzen/Aufruf von Funktion B weiterhin frei laufen, so lange, wie Eine Funktion nicht ausgeführt wird?

Dank

  • Sie suchen eine Leser/Schreiber-sperren. Ich weiß, dass boost hat eine (es heißt shared_lock).
  • Pthreads scheinen schon zu: pthread_rwlock_t
  • - Funktion", B ... ist nicht zu ändern in der Karte alle". Wanna bet? operator[] ändern kann seine Karte.
  • ging darauf zu, ich hatte einen bösen Fehler vor kurzem, verursacht durch genau diese. - usefindinstead wenn Sie nicht möchten, fügen Sie das fehlende Element
  • hat die pthread_rw_lock (wenn Sie schreiben) warten Sie, bis das Lesen abgeschlossen sein?
  • hat die shared_lock(wenn Sie schreiben) warten Sie, bis das Lesen abgeschlossen sein?
  • Ja, danke, ich vergaß, ich werde ändern Sie den code so schnell wie möglich
  • Naja, die einzige andere option für operator[] würde eine exception werfen, so ist es eigentlich logisch, es ändert die map.
  • ja, das ist der Punkt. Zu jeder Zeit, die Sie haben entweder keinen thread, der die Sperre hält; ein thread, der die Sperre hält für das schreiben; einen oder mehrere threads die Sperre für das Lesen. Ich nehme an, die genannten pthread_rwlock_t funktioniert auf die gleiche.
  • Es scheint, dass der pthread-Implementierung/langsamer sein, werde ich beginnen mit der boost-Implementierung und-Profil, um zu sehen, dass. Danke für die info!
  • Mit der find iterator Read außerhalb der Sperre ist die schlechte Nachricht, die ich denken würde. Ein über-schreiben der zurückgegebenen element ungültig erklären kann das iterator-was in einem schrecklichen hart-zu-finden-bug. Auch Ihre Schlösser, wie hier gezeigt, sind nicht exception-sicher, wenn Sie stick mit POSIX verwenden Wachen als mit boost::shared_lock. Irgendeinen guten Grund, um nicht pass in die params als const std::string& ?
  • Während ich dont wollen zu hinterfragen, die Entscheidungen von OP möchte ich Sie auf die Poco-Framework, welches sehr einfach zu bedienen, und zwar komplett multithreading-Unterstützung. pocoproject.org/slides/130-Threads.pdf

InformationsquelleAutor Joshua | 2012-06-04
Schreibe einen Kommentar