я могу использовать boost::lock_guard
приобрести замок на boost::mutex
объект и этот механизм установит, что как только boost::lock_guard
выходит из области видимости, замок будет снят:
{
boost::lock_guard<boost::mutex> lock(a_mutex);
// Do the work
}
В этом случае, a_mutex
будет выпущено независимо от того, был ли блок кода завершен исключением или нет.
С другой стороны, boost::timed_mutex
также поддерживает метод try_lock_for(period)
например,
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
}
Этот код не будет unlock()
a_timed_mutex
если true
блок из if
заявление завершено с исключением.
Вопрос: Повышение (и, насколько я вижу, ни стандарт C ++ 11), кажется, не предлагают вариант lock_guard
это работает с try_lock()
или же try_lock_for(period)
, Каков «рекомендуемый» способ или лучшая практика для решения второй ситуации?
Вы можете создать защиту замка после блокировки, сказав, что она должна принять блокировку:
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
}
Стандарт lock_guard также позволяет это.
попробуйте unique_lock, unique_lock :: try_lock_for ()