Wie std :: mutex :: lock, bis die Funktion zurückkehrt

8

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?

    
Korchkidu 09.12.2014, 16:43
quelle

2 Antworten

15

Verwenden Sie eine std::lock_guard , um das Sperren und Entsperren von mutex über RAII zu übernehmen wörtlich, wofür es gemacht wurde.

%Vor%

Wenn foo zurückgibt, fällt lg außerhalb des Bereichs und unlock some_mutex , wenn dies der Fall ist.

    
CoryKramer 09.12.2014, 16:47
quelle
7

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:

%Vor%

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.

    
Howard Hinnant 09.12.2014 19:41
quelle

Tags und Links