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