Я использовал C# в течение последних нескольких лет, и я - в настоящее время устранение ошибки в C++. В C# я мог использовать, соединяют объект сделать мой код ориентированным на многопотоковое исполнение с:
lock(lockObject)
{
// Do some work
}
Это разблокировало бы lockOject, если бы было исключение в // Do some work
Действительно ли там что-то подобно в C++? В данный момент я могу думать также:
// Code
{
AutoLock lock(lockObject);
// Do some work
}
// More Code
Но мне не нравятся фигурные скобки только для обзора моего AutoLock
. В данный момент я делаю:
AutoLock lock(lockObject);
// Do some work
lock.Unlock();
И позволяя раскрутке исключения выпустить блокировку, если существует исключение в //Do some work
.
Что я делаю в данный момент работы, но я задаюсь вопросом, существует ли лучший путь, спасибо.
Но мне не нравятся фигурные скобки только для охвата моего
AutoLock
.
Вот как это делается в C ++.
Обратите внимание, что вам не нужно иметь отдельный блок области видимости для каждого AutoLock
; следующее тоже нормально:
{
AutoLock lock1;
AutoLock lock2;
// more code goes here
} // lock2 gets destroyed, then lock1 gets destroyed
Это также не обязательно должен быть отдельный блок области видимости; если вы что-то блокируете в функции и не хотите, чтобы это было разблокировано до тех пор, пока функция не вернется, вы можете просто использовать область действия функции для ограничения блокировки. Точно так же, если вы что-то блокируете во время каждой итерации в блоке цикла, вы можете использовать блок области видимости цикла, чтобы ограничить блокировку.
Ваш подход к ручной разблокировке мьютекса, когда вы закончите с ним, хорош, но это не идиоматический C ++ и не такой ясный. Это затрудняет определение того, где разблокирован мьютекс (возможно, не намного сложнее, но сложнее, чем должно быть).
Ваша вторая версия подойдет. Рассмотрите возможность разделения вашего метода, если у вас слишком много фигурных скобок, предназначенных только для блокировки области действия. Прочтите RAII , это общий шаблон, лежащий в основе этой техники, и его можно применять ко всем видам управления ресурсами.