Контекст:
Я знаю, что std::lock_guard
стало отчасти устаревшим с момента появления c ++ 17 с std::scoped_lock
.
Я также знаю, что std::scoped_lock
предпочтительнее, поскольку он может обрабатывать несколько мьютексов и использует алгоритм предотвращения тупиковых ситуаций так же, как std::lock
.
Меня интересует случай, когда у нас есть только один один мьютекс, и поэтому нам не нужно заботиться о предотвращении тупиков.
Я прочитал этот ответ , что:
Вы можете рассмотреть std::lock_guard
осуждается. Случай с одним аргументом std::scoped_lock
может быть реализован как специализация, поэтому вам не нужно опасаться возможных проблем с производительностью.
Вопрос:
Мне интересно, насколько верно это предложение.
Я имею в виду, гарантировано ли (по стандарту), что с одним мьютексом std::scoped_lock
будет специализированным, чтобы избавиться от ненужного накладные расходы из-за обработки предотвращения тупиков?
Мои мысли:
После некоторого исследования по этому вопросу я обнаружил из cppreference следующее предложение:
Если дано несколько мьютексов, алгоритм избежания тупиковой ситуации используется, как если бы std::lock
.
Что позволило бы нам сделать вывод, что такого не произойдет в противном случае (т. е. если задан только один мьютекс). Но опять же, это всего лишь предположение.
Из этого c ++ черновика Я не вижу явного упоминания о такой специализации. Единственное предложение, которое я получил:
Когда sizeof...(MutexTypes)
равно 1
, поставляемый тип Mutex
должен соответствовать требованиям Cpp17BasicLockable . В противном случае каждый из типов мьютекса должен удовлетворять требованиям Cpp17Lockable .
(выделено мной)
Я знаю, что * 1071 Требования * BasicLockable требуют наличия функций lock()
и unlock()
, которые удовлетворяют условиям, таким как определенные здесь . С другой стороны, требования Lockable предполагают требования BasicLockable с добавлением функции try_lock()
, которая удовлетворяет условиям, таким как определенные там .
Я знаю, что функция try_lock()
необходима для запуска алгоритма предотвращения тупиковой ситуации, используемого std::lock
.
Из того, что указано в приведенном выше c ++ черновом извлечении, функция try_lock()
, таким образом, не требуется, если мы даем только один мьютекс std::scoped_lock
. Достаточно ли этого, чтобы вывести / учесть, что указанная выше специализация всегда определяется (и предположительно ведет себя так, как std::lock_guard
)? Я бы сказал да, но так как я никогда не видел явного упоминания об этом, мне интересно, прав ли я или что-то пропустил?
РЕДАКТИРОВАТЬ:
Я только что заметил, что пропустил самую важную часть здесь , которая гласит:
Эффекты : Инициализирует pm
с tie(m...)
. Тогда, если sizeof...(MutexTypes)
равно 0
, никаких эффектов нет. В противном случае, если sizeof...(MutexTypes)
равно 1
, то m.lock()
. В противном случае, lock(m...)
.
(выделено мной)
Что отвечает на мои допросы, std::lock
вызывается только тогда, когда есть более одного данного мьютекса. Я должен был увидеть это, прежде чем задавать вопрос ...