В нашем приложении мы обрабатываем данные, которые обрабатываются в рабочем потоке и доступны в потоке отображения, и у нас есть мьютекс, который заботится о критических разделах. Ничего особенного.Шаблон проектирования защищенных данных
Теперь мы подумали о том, чтобы переработать наш код, где блокировка в настоящий момент выполняется непосредственно стороной, занимающейся хранением и обработкой данных. Мы думали о едином объекте, который хранит данные и только обеспечивает доступ к данным в охраняемом режиме.
Для этого у нас есть класс под названием GuardedData. Вызывающий может запросить такой объект и должен хранить его только в течение короткого времени в локальной области. Пока объект живет, он держит замок. Как только объект уничтожается, блокировка освобождается. Доступ к данным связан с механизмом блокировки без какой-либо конкретной дополнительной работы в вызывающем устройстве. Название класса напоминает звонящего настоящего охранника.
template<typename T, typename Lockable>
class GuardedData {
GuardedData(T &d, Lockable &m) : data(d), guard(m) {}
boost::lock_guard<Lockable> guard;
T &data;
T &operator->() { return data; }
};
Опять же, очень простая концепция. Оператор-> имитирует семантику итераторов STL для доступа к полезной нагрузке.
Теперь интересно:
- Является ли этот подход хорошо известен?
- Возможно ли, что шаблонный класс, подобный этому, уже доступен, например. в ускорительных библиотеках?
Я спрашиваю, потому что я думаю, что это довольно общая и полезная концепция. Я не мог найти ничего подобного.
У меня есть данные, которые можно изменить в фоновом режиме во время доступа к нему на переднем плане. Фактически, данные меняются местами при завершении расчета фона. Этот обмен не должен происходить, когда кто-то обращается к данным, что может привести к тому, что эта сторона окажется в противоречивом состоянии. Нам нужно сделать своп вместо того, чтобы просто создавать новый экземпляр, в то время как другие все еще используют старый экземпляр. Причина в том, что огромное количество данных будет постоянно находиться в памяти. – ypnos