Как я могу вернуть блокировку с областью действия?C++

Программы на C++. Форум разработчиков
Anonymous
Как я могу вернуть блокировку с областью действия?

Сообщение Anonymous »

Рассмотрим, скажем, совокупность остатков на счетах. И тогда у вас есть сложная функция, которая должна проверить балансы нескольких разных учетных записей, а затем скорректировать балансы нескольких разных учетных записей. Операции должны быть атомарными по отношению к другим пользователям коллекции. У вас есть класс коллекции, основная задача которого — обеспечить такую ​​атомарность. Какой путь «правильный»?

У меня есть класс, в котором есть элемент boost::mutex. Проблема в том, что вызывающему объекту может потребоваться выполнить серию вызовов класса, удерживая мьютекс. Но я не хочу предоставлять коду, находящемуся за пределами класса, в мьютексе.

Я хотел бы сделать что-то вроде этого (псевдокод):

Код: Выделить всё

class MyClass
{
private:
boost::mutex mLock;
public:
boost::scoped_lock& ScopedLock(return ScopedLock(mLock));
}
Таким образом, вызывающие абоненты могут сделать следующее:

Код: Выделить всё

MyClass f;
if(foo)
{
boost::scoped_lock lock(f->GetScopedLock());
f->LockedFunc1();
f->LockedFunc2();
}
Идея состоит в том, что LockedFunc1 и LockedFunc2 будут вызываться с удерживаемой блокировкой. Деструктор lock разблокирует f->mLock.

У меня два основных вопроса:

1) Как я могу это сделать?

2) Разумно ли это?

Примечание : Это полностью отличается от вопроса с таким же названием: return a boost::scoped_lock.

Подробнее здесь: https://stackoverflow.com/questions/808 ... coped-lock

Вернуться в «C++»