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

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

У меня есть класс с членом 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 .

13
задан Community 23 May 2017 в 12:00
поделиться