«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > std::lock_guard против std::scoped_lock: когда выбирать?

std::lock_guard против std::scoped_lock: когда выбирать?

Опубликовано 8 ноября 2024 г.
Просматривать:835

std::lock_guard vs. std::scoped_lock: When to Choose Which?

Размышление о std::lock_guard и std::scoped_lock

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

Когда использовать std::lock_guard

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

{
    std::scoped_lock lock;  // protect this block
    ...
}

Этот фрагмент непреднамеренно приводит к ошибке во время выполнения, поскольку он ведет себя «невидимо». Кажется, что он компилируется гладко, но в конечном итоге не приводит к блокировке. Предполагаемая функциональность, вероятно, требовала:

{
    std::scoped_lock lock{mut};  // protect this block
    ...
}

Уточнение целевого мьютекса для блокировки решает эту проблему. И наоборот, использование std::lock_guard предотвратит компиляцию первого примера, что приведет к явной ошибке времени компиляции.

Когда использовать std::scoped_lock

Когда использовать std::scoped_lock

{
    std::scoped_lock(lock1, lock2);  // protect this block
    ...
}
Когда Столкнувшись с ситуациями, когда требуется блокировка нескольких мьютексов, std::scoped_lock будет полезен. Например:

{ std::scoped_lock(lock1, lock2); // защищаем этот блок ... }

Этот фрагмент кратко блокирует два мьютекса на время блока.

Заключение

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

std::scoped_lock для блокировки нескольких мьютексов или для разблокировки в пределах включенной области.

std::lock_guard vs. std::scoped_lock: When to Choose Which? 
Хотя std::scoped_lock обеспечивает более полную функциональность, std::lock_guard предлагает повышенную безопасность API в определенных случаях. При выборе наиболее подходящего подхода внимательно учитывайте требования своего кода.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3