Как использовать lock_guard с try_lock_for

я могу использовать 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), Каков «рекомендуемый» способ или лучшая практика для решения второй ситуации?

9

Решение

Вы можете создать защиту замка после блокировки, сказав, что она должна принять блокировку:

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 также позволяет это.

12

Другие решения

попробуйте unique_lock, unique_lock :: try_lock_for ()

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector