Отсрочка блокировок и `boost :: lock`

0

Я читал разницу между lock_guard и unique_lock, и я узнал, что unique_lock - это расширенная версия lock_guard. Таким образом, с уникальной блокировкой блокировка всегда может быть отложена. Я читал эту статью, и я наткнулся на boost :: lock. Я хотел знать, как я могу использовать этот метод. Я попробовал следующее:

boost::mutex mutx;
boost::unique_lock<boost::mutex> guard (mutx,boost::defer_lock);
boost::lock(guard); //too few arguments in function call.

Я был бы признателен, если бы кто-нибудь мог объяснить мне, что такое boost :: lock делает и как это работает. Спасибо

Теги:
multithreading
boost-mutex

2 ответа

0
Лучший ответ

Цель boost::lock - блокировка нескольких замков, гарантирующих, что не произойдет взаимоблокировки.

Рассмотрим случай:

unique_lock<...> a, b;

// thread 1
a.lock();
b.lock();
...

// thread 2
b.lock();
a.lock();

Теперь, если первый поток блокировки замка, а затем вторая нить запирает a b замок, у вас есть проблема: как замки заперты и нить не будет ничего выполнять, если один из них не отпирает замок, который не возможно. Это условие называется тупиком.

boost::lock устраняет эту проблему, отпирая все заблокированные блокировки, когда она сталкивается с заблокированной блокировкой. Реализация для двух случаев блокировки может выглядеть примерно так:

template<class L1, class L2>
void lock(L1& l1, L2& l2) 
{
    while (1) {
        if (l1.try_lock()) {
            if (l2.try_lock()) {
                return;
            } else {
                l1.unlock();
            }
        } 
        // yield (execute another thread) here
    }
}
0

Ты имел ввиду

mutex mutx
unique_lock<mutex> guard(mutx,defer_lock);
guard.lock();

?

После того, как у вас есть lock_guard или unique_lock, вы перестанете unique_lock с мьютексом напрямую, и вы работаете над объектом защиты.

  • 0
    Спасибо только что исправили мой код. Я понимаю эту часть. Однако я хотел знать, что делает boost::lock и как его использовать
  • 0
    Вы пытались читать документы ? Я говорю там, он блокирует несколько объектов, избегая тупиков. Не имеет смысла называть его одним аргументом, хотя это может обеспечить большую однородность; черт, это может даже поддерживать нулевой аргумент и ничего не делать ... но это не так, как было задумано.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню