Автоматическая блокировка / разблокировка с использованием области видимости в C ++ (из фона C #) - PullRequest
6 голосов
/ 19 июля 2010

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

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

Ответы [ 2 ]

8 голосов
/ 19 июля 2010

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

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

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

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

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

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

2 голосов
/ 19 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...