Размышление о 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::scoped_lock для блокировки нескольких мьютексов или для разблокировки в пределах включенной области.
Хотя std::scoped_lock обеспечивает более полную функциональность, std::lock_guard предлагает повышенную безопасность API в определенных случаях. При выборе наиболее подходящего подхода внимательно учитывайте требования своего кода.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3