СТД::замок гвардии или std::области замка?


C++17 представил новый класс блокировки под названием std::scoped_lock.

судя по документации, он похож на уже существующий std::lock_guard класса.

в чем разница и когда я должен использовать его?

2   51   2017-03-25 20:29:59

2 ответа:

The scoped_lock является строго улучшенной версией lock_guard который блокирует произвольное количество мьютексов сразу (используя тот же алгоритм предотвращения взаимоблокировки, что и std::lock). В новом коде вы должны использовать только scoped_lock.

единственная причина lock_guard все еще существует для совместимости. Он не может быть просто удален, потому что он используется в текущем коде. Кроме того, доказано нежелательно, чтобы изменить его определение (от одинарных до вариативную), потому что тоже заметный, а значит ломка, изменение (но по некоторым техническим причинам).

единое и важное различие заключается в том, что std::scoped_lock имеет вариационный конструктор, принимающий более одного мьютекса. Это позволяет блокировать несколько мьютексов в тупик, избегая пути, как если бы .

{
    // safely locked as if using std::lock
    std::scoped_lock<std::mutex, std::mutex> lock(mutex1, mutex2);     
}

ранее вы должны были сделать небольшой танец, чтобы заблокировать несколько мьютексов безопасным способом с помощью std::lock Как пояснил ответ.

добавление блокировки области делает это проще в использовании и позволяет избежать связанных с этим ошибок. Вы можете рассмотреть std::lock_guard не одобрять. Единственный случай аргумента std::scoped_lock может быть реализован как специализация, и вам не нужно бояться возможных проблем с производительностью.

GCC 7 уже имеет поддержку std::scoped_lock что можно увидеть здесь.

для получения дополнительной информации вы можете прочитать стандартная бумага