2015-11-29 7 views
8

Gibt es eine Möglichkeit, ich kann std::lock_gaurd anrufen try_lock anstelle von lock, wenn er den Mutex erwirbt?Verwenden Sie std :: lock_guard mit try_lock

Die einzige Art, wie ich denken konnte, ist std::adopt_lock zu verwenden:

if (!_mutex.try_lock()) 
{ 
    // Handle failure and return from the function 
} 
std::lock_guard<my_mutex_class> lock(_mutex, std::adopt_lock); 

Gibt es eine integrierte Lösung für mein Problem eher dann die Sperre explizit zu erwerben und dann lock_guard gibt die Verantwortung für sie zu veröffentlichen?

+0

Ich bin ziemlich sicher, das ist die integrierte Lösung, die Sie bereits verwenden. – user2079303

Antwort

22

Eine grundlegende Design-Invariante von lock_guard ist, dass es immer das Schloss hält. Dies minimiert den Overhead, da sein Destruktor bedingungslos unlock() aufrufen kann und keinen zusätzlichen Status speichern muss.

Wenn Sie das Try-to-Lock Verhalten benötigen, verwenden unique_lock:

std::unique_lock<std::mutex> lock(_mutex, std::try_to_lock); 
if(!lock.owns_lock()){ 
    // mutex wasn't locked. Handle it. 
}