Автоматическая блокировка/разблокирование с помощью объема в C++ (происхождения C#)

Я использовал 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.

Что я делаю в данный момент работы, но я задаюсь вопросом, существует ли лучший путь, спасибо.

6
задан JLWarlow 19 July 2010 в 15:58
поделиться

2 ответа

Но мне не нравятся фигурные скобки только для охвата моего AutoLock .

Вот как это делается в C ++.

Обратите внимание, что вам не нужно иметь отдельный блок области видимости для каждого AutoLock ; следующее тоже нормально:

{
    AutoLock lock1;
    AutoLock lock2;
    // more code goes here
} // lock2 gets destroyed, then lock1 gets destroyed

Это также не обязательно должен быть отдельный блок области видимости; если вы что-то блокируете в функции и не хотите, чтобы это было разблокировано до тех пор, пока функция не вернется, вы можете просто использовать область действия функции для ограничения блокировки. Точно так же, если вы что-то блокируете во время каждой итерации в блоке цикла, вы можете использовать блок области видимости цикла, чтобы ограничить блокировку.

Ваш подход к ручной разблокировке мьютекса, когда вы закончите с ним, хорош, но это не идиоматический C ++ и не такой ясный. Это затрудняет определение того, где разблокирован мьютекс (возможно, не намного сложнее, но сложнее, чем должно быть).

8
ответ дан 10 December 2019 в 00:31
поделиться

Ваша вторая версия подойдет. Рассмотрите возможность разделения вашего метода, если у вас слишком много фигурных скобок, предназначенных только для блокировки области действия. Прочтите RAII , это общий шаблон, лежащий в основе этой техники, и его можно применять ко всем видам управления ресурсами.

2
ответ дан 10 December 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: