Ich möchte ein std::vector
zurückgeben. Auf dieses std::vector
kann von anderen Threads zugegriffen werden (Lesen und Schreiben). Wie kann ich mein std::mutex
entsperren, nachdem die Funktion beendet wurde?
Zum Beispiel in etwas wie:
%Vor%Was ist, wenn "Super cleveres Zeug hier" leer ist?
%Vor%Dann ist das Schloss noch obligatorisch? Warum?
Verwenden Sie eine std::lock_guard
, um das Sperren und Entsperren von mutex
über RAII zu übernehmen wörtlich, wofür es gemacht wurde.
Wenn foo
zurückgibt, fällt lg
außerhalb des Bereichs und unlock
some_mutex
, wenn dies der Fall ist.
Dies ist die Art von Frage, mit der Druckanweisungen wirklich helfen können. Zum Beispiel:
%Vor% Indem ich meine eigene Version von std::lock_guard
erstelle, kann ich print-Anweisungen einfügen, um herauszufinden, wann der Mutex gesperrt und entsperrt wird.
Und indem ich eine falsche std::vector
(oben A
genannt) mache, kann ich print-Anweisungen in die speziellen Mitglieder einfügen, an denen ich interessiert bin. Für mich gibt das aus:
zeigt deutlich, dass der Mutex gesperrt ist, während der A
bei 0x10fcfb188 kopiert wird.
Der Test kann für die Zuweisung mit:
geändert werden %Vor%was jetzt ausgibt:
%Vor% Zunächst sieht es so aus, als ob die Zuweisung außerhalb des Schlosses stattfindet und somit unsicher aussieht. Bei näherer Betrachtung sieht man jedoch, dass die geschützte A
bei 0x10d8a7190 in eine temporäre A
innerhalb der Sperre kopiert wird. Der Mutex wird dann entsperrt und eine Zuweisung vom temporären zum lokalen erfolgt. Kein anderer Thread könnte möglicherweise auf das temporäre verweisen. Solange kein anderer Thread auf vec
verweist, ist dies wieder sicher.
Tags und Links c++ thread-safety concurrency