2014-04-19 6 views
7

posso usare boost::lock_guard di acquisire un blocco su un oggetto boost::mutex e questo meccanismo verificherà che una volta che il boost::lock_guard passa nell'ambito uscirà serratura:Come utilizzare un lock_guard con try_lock_for

{ 
    boost::lock_guard<boost::mutex> lock(a_mutex); 
    // Do the work 
} 

In questo case, a_mutex verrà rilasciato indipendentemente dal fatto che il blocco di codice sia stato chiuso da un'eccezione o meno.

D'altra parte, un boost::timed_mutex supporta anche un metodo try_lock_for(period), ad es.

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 
} 

Questo codice non sarà unlock() il a_timed_mutex se il true blocco della dichiarazione if si esce con un'eccezione.

Domanda: Boost (e, per quanto posso vedere, né il C++ 11 standard) non sembrano offrire una variante di lock_guard che funziona con try_lock() o try_lock_for(period). Qual è il modo "consigliato" o la migliore pratica per gestire la seconda situazione?

risposta

10

È possibile creare la guardia di blocco dopo aver bloccato, dicendogli di adottare il blocco:

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 
} 

Lo standard lock_guard permette anche questo.

-1

provare unique_lock, unique_lock :: try_lock_for()