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?
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.
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.
Aus Leistungsgründen schlage ich vor, den Mutex vorher zu entsperren, um andere Threads zu benachrichtigen.
Tags und Links c++ c++11 condition-variable