Mutex + konstante Funktion
-
Ich hab folgende funktion:
size_t getSize() const{ return m_locked_list.size(); }Weil der zugriff auf m_locked_list threadsafe sein soll, muss ich
den zugriff auf m_locked_list blockieren bevor ich die .size() funkition aufrufe.
Dazu wollte ich die lokale CLock-klasse verwenden:
(der konstruktor blockiert und der destruktor gibt den zugriff wieder frei)size_t getSize() const{
CLock lock(this);
return m_locked_list.size();
}und hier mein kleines problem.
getSize ist eine konstante funktion, kann also keine member variable ändern und somit die mutex nicht blockieren.Gibt es irgenteine möglichkeit m_locked_list durch eine mutex zu blockieren und trotzdem die funktion konstant zu lassen?
-
->mutable
-
Übrigens bin ich mir nicht sicher, ob der Mutex so überhaupt korrekt greift. Ich würde den Rückgabewert in einer Variable zwischenspeichern:
lock(); const std::size_t size = m_locked_list.size(); unlock(); return size;
-
War schon korrekt so...
-
lock();//passiert im Konstruktor von CLock const std::size_t size = m_locked_list.size(); unlock();//passiert im Destruktor!!! Prima Sache, klappt auch bei Exceptions und Gedöns return size;
-
klöklöklö schrieb:
Übrigens bin ich mir nicht sicher, ob der Mutex so überhaupt korrekt greift. Ich würde den Rückgabewert in einer Variable zwischenspeichern:
lock(); const std::size_t size = m_locked_list.size(); unlock(); return size;Das Kopieren des Returnwert erfolgt bevor der Scope der Funktion verlassen wird.
Also auch bevor der Destruktor der "Scoped-Lock" Klasse läuft.
Also alles OK.Eselsbrücke: man kann ja auch lokale Variablen zurückgeben. Die können natürlich nur kopiert werden so lange sie noch nicht zerstört wurden. Also *muss* das Kopieren des Returnwert erfolgen bevor der Scope der Funktion verlassen wird, sonst wären die lokalen Variablen ja schon weg.
-
Okay, ich glaube mutable ist das was ich gesucht habe..
wenn es nicht funktioniert melde ich mich nochmal.
-
Ihhh, was ist denn CLock. std::lock_guard verwenden...
-