wird ein Mutex beim Aufruf von notify für eine Bedingungsvariable entsperrt

8

Ich versuche zu verstehen, was mit einem Mutex passiert, wenn es in einer Zustandsvariablen verwendet wird.

Im folgenden Beispiel aus cppreference

%Vor%

Der Producer-Thread ruft cond_var.notify_one () auf, bevor der Mutex entsperrt wird. Wird der Mutex m beim Aufruf von notify entsperrt oder erfolgt die Benachrichtigung nur, wenn der Mutex entsperrt wird?

    
danny 22.10.2012, 20:33
quelle

3 Antworten

6

Durch die Benachrichtigung wird der Mutex nicht entsperrt. Sie können (indirekt) sagen, weil Sie die Sperre nicht an notify_one() weitergeben, wie Sie es bei wait() tun, was den Mutex freigibt, während er wartet.

Auf der anderen Seite werden die notifizierten Threads sofort benachrichtigt. Aber sie werden nicht unbedingt sofort von wait() zurückkehren. Bevor sie von wait() zurückkehren können, müssen sie zuerst den Mutex erneut akquirieren, damit sie dort blockieren, bis der Benachrichtigungs-Thread sie freigibt.

    
John Kugelman 22.10.2012, 20:38
quelle
3

Die Sperre wird im Konstruktor erworben und im Destruktor von std::unique_lock freigegeben. Aus dieser Information können Sie ableiten, dass der Produzent die Sperre nach dem Aufruf von notify_one() beendet.

    
SomeWittyUsername 24.10.2012 20:14
quelle
0

Aus Leistungsgründen schlage ich vor, den Mutex vorher zu entsperren, um andere Threads zu benachrichtigen.

    
Gaetano Mendola 03.01.2017 16:42
quelle

Tags und Links