Рассмотрим, скажем, набор балансов на счетах. А затем у вас есть сложная функция, которая должна проверять балансы нескольких разных учетных записей, а затем корректировать балансы нескольких разных учетных записей. Операции должны быть атомарными по отношению к другим пользователям коллекции. У вас есть класс коллекции, основная задача которого - обеспечить такую атомарность. Какой «правильный» путь?
У меня есть класс с членом 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
будет вызываться с удерживаемой блокировкой. Деструктор для блокировки
разблокирует f-> mLock
.
У меня два основных вопроса:
1) Как я могу это сделать?
2) Разумно ли это?
Примечание: Это полностью отличается от вопроса с аналогичным названием: вернуть повышение :: scoped_lock .