2014-04-19 14 views
7

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ą?

Odpowiedz

10

Można tworzyć osłonę zamka po zablokowaniu, informując go przyjąć blokady:

if(a_timed_mutex.try_lock_for(boost::chrono::seconds(1))) { 
    boost::lock_guard<boost::mutex> lock(a_timed_mutex, boost::adopt_lock_t()); 
    // Do the work 
} else { 
    // Handle the acquisition failure 
} 

Standardowa lock_guard Pozwala to również.

-1

spróbuj unique_lock, unique_lock :: try_lock_for()