Почему в c ++ 11 std :: lock и std :: scoped_lock нужно как минимум 2 параметра? - PullRequest
0 голосов
/ 26 января 2020

Только что обнаружил, что этим 2 утилитам нужно как минимум 2 параметра, например, 2 мьютекса для блокировки.

Должно быть так (из cppreference.com):

void assign_lunch_partner(Employee &e1, Employee &e2)
{
    static std::mutex io_mutex;
    {
        std::lock_guard<std::mutex> lk(io_mutex);
        std::cout << e1.id << " and " << e2.id << " are waiting for locks" << std::endl;
    }

    {
        std::scoped_lock lock(e1.m, e2.m);
    }
}

Делает ли это есть смысл требовать в аренду 2 параметра? Каково было рассмотрение проекта, wi sh, чтобы узнать больше деталей.

Большое спасибо.

1 Ответ

2 голосов
/ 26 января 2020

Для него не требуется два , он может заблокировать один или несколько .

Со страницы cppreference вы взяли пример с (выделение мое):

Класс scoped_lock является оберткой мьютекса, которая предоставляет удобный механизм в стиле RAII для владения одним или несколькими мьютексами на время действия блока с областью видимости.

std::scoped_lock - это удобная утилита для получения нескольких мьютексов - она ​​будет использовать механизм предотвращения тупиковых ситуаций под капотом. В C ++ 11 и C ++ 14 у нас было только std::lock(), но это не механизм RAII (он не разблокирует мьютексы автоматически).

Вы также можете использовать std::scoped_lock с одним мьютексом, то становится равным std::lock_guard

...