Использование дополнительной области, специально предназначенной для ограничения времени жизни объекта std :: lock_guard, действительно является хорошей практикой.Как указывают другие ответы, блокировка вашего мьютекса на кратчайший период времени уменьшит вероятность того, что другой поток заблокирует мьютекс.
Я вижу еще один момент, который не был упомянут в других ответах: транзакционныйоперации.Давайте использовать классический пример перевода денег между двумя банковскими счетами.Чтобы ваша банковская программа была правильной, изменение баланса двух банковских счетов должно быть выполнено без разблокировки мьютекса между .В противном случае другой поток мог бы заблокировать мьютекс, пока программа находится в странном состоянии, когда только одна из учетных записей была зачислена / списана, а баланс другой учетной записи остался нетронутым!
Имея это в виду,этого недостаточно, чтобы гарантировать, что мьютекс заблокирован при изменении каждого общего ресурса .Иногда вы должны держать мьютекс заблокированным в течение периода времени, охватывающего изменение всех общих ресурсов , которые формируют транзакцию.
РЕДАКТИРОВАТЬ:
Если по какой-либо причинесохранение мьютекса заблокированным на протяжении всей транзакции недопустимо, вы можете использовать следующий алгоритм:
1. Блокировка мьютекса, чтение входных данных, разблокировка мьютекса.
2. Выполнение всех необходимых вычислений, сохранение результатов локально.
3. Блокировка мьютекса, проверка того, что входные данные не изменились , выполнение транзакции с легкодоступными результатами, разблокировка мьютекса.
Если входные данные изменились во время выполненияна шаге 2 отбросьте результаты и начните заново со свежих входных данных.