mogę używać boost::lock_guard
uzyskania blokady na boost::mutex
obiektu i mechanizm ten będzie ustalić, że po boost::lock_guard
wykracza poza zakres blokada zostanie wydany:Jak używać lock_guard z try_lock_for
{
boost::lock_guard<boost::mutex> lock(a_mutex);
// Do the work
}
w tym case, a_mutex
zostanie zwolniony niezależnie od tego, czy blok kodu został wyłączony przez wyjątek, czy nie.
Z drugiej strony, boost::timed_mutex
obsługuje również metodę try_lock_for(period)
, np.
if(a_timed_mutex.try_lock_for(boost::chrono::seconds(1))) {
// Do the work
a_timed_mutex.unlock(); // <- This is needed!
} else {
// Handle the acquisition failure
}
Ten kod nie unlock()
a_timed_mutex
jeżeli blok true
zestawienia if
zostanie zamknięty z wyjątkiem.
Pytanie: doładowania (i, o ile widzę, ani standard C++ 11) nie wydają się zaoferować wariant lock_guard
który współpracuje z try_lock()
lub try_lock_for(period)
. Jaki jest "zalecany" sposób lub najlepsza praktyka, aby poradzić sobie z drugą sytuacją?