Sie sind nicht wirklich die gleichen Mutexe, lock_guard
hat fast das gleiche wie std::mutex
, mit dem Unterschied, dass sein Lebensdauer am Ende des Gültigkeitsbereichs endet (D-Tor aufgerufen wurde), daher eine klare Definition dieser beiden Mutexe :
lock_guard
verfügt über einen Mechanismus zum Besitzen eines Mutex für die Dauer eines begrenzten Blocks.
Und
unique_lock
ist ein Wrapper, der das verzögerte Sperren, zeitbeschränkte Versuche des Sperrens, rekursives Sperren, Übertragung des Besitzes des Schlosses und die Verwendung mit bedingten Variablen ermöglicht.
Hier ist ein Beispiel für die Implementierung:
#include
#include
#include
#include
#include
#include
using namespace std::chrono;
class Produkt{
public:
Produkt(int daten):mdata(data){
}
virtual~Produkt(){
}
bool istBereit(){
return flag;
}
void datenZeigen(){
std::cout< guard(mmutex);
flag = true;
std::cout<<"Daten sind bereit"< sperre(mmutex);
cvar.wait(sperre, [&, this]() mutable throw() -> bool{ return this->istBereit(); });
mdata+=1;
}
protected:
std::condition_variable cvar;
std::mutex mmutex;
int mdata;
bool flag = false;
};
int main(){
int a = 0;
Produkt produkt(a);
std::thread lesen(produkt.lesen, &produkt);
std::thread einstellen(produkt.aufgabe, &produkt);
lesen.join();
einstellen.join();
produkt.datenZeigen();
return 0;
}
In diesem Beispiel habe ich unique_lock
mit Bedingungsvariable
verwendet