template <typename T> class SharedHandle final {...};
Handle to a File Storage or Key-Value Storage. A SharedHandle is returned by the functions OpenFileStorage() and OpenKeyValueStorage() and can be passed between threads as needed. It provides the abstraction that is necessary to allow thread-safe implementation of OpenFile Storage() and OpenKeyValueStorage().
Обеспечивает потокобезопасный доступ к хранилищу файлов и хранилищу «ключ-значение» через границы потоков.
СОЗДАНО ИИне провереноМодель: gemini-3.8-flash-medium · Усилие: medium · Температура: не регулируется · Промпт: 7420a4e54761ПроисхождениеОткрытые вопросы (1)
переведено с немецкого руководстваgemini-3.8-flash-low · 2026-10-13 · Немецкий оригинал
Обеспечивает потокобезопасный доступ к хранилищу файлов и хранилищу «ключ-значение» через границы потоков.
Шаблонный класс ara::per::SharedHandle служит абстракцией умного указателя (smart pointer) для хранилищ файлов и хранилищ «ключ-значение» для обеспечения потокобезопасного доступа через границы потоков. После получения через фабричные функции состояние валидности дескриптора (handle) должно быть проверено через operator bool()[SWS_PER_00398], поскольку вызов других операторов для пустого или сделанного недействительным операциями перемещения дескриптора приводит к неопределенному поведению. В то время как разыменование инкапсулированного объекта является потокобезопасным, операции присваивания и уничтожение дескриптора [SWS_PER_00568] для одного и того же экземпляра требуют внешней синхронизации.
Контекст
Шаблонный класс ara::per::SharedHandle представляет собой абстракцию «умного указателя» для персистентных ресурсов хранения в модуле per (Persistency) платформы AUTOSAR Adaptive Platform. Он служит стандартизированным типом возвращаемого значения фабричных функций OpenFileStorage() и OpenKeyValueStorage(). Основная обязанность класса состоит в координации доступа к файловым хранилищам и хранилищам типа «ключ — значение» через границы потоков, а также в обеспечении необходимой инкапсуляции для потокобезопасной реализации процедур открытия хранилищ и доступа к ним. Участниками взаимодействия являются потоки выполнения на стороне приложения, управление персистентностью, а также соответствующий инкапсулированный ресурс хранения T.
Жизненный цикл
Дескриптор SharedHandle обычно создается при открытии экземпляра хранилища через фабричные интерфейсы модуля per. С помощью конструктора копирования [SWS_PER_00369] и оператора присваивания копированием [SWS_PER_00370] дескриптор можно дублировать, благодаря чему несколько экземпляров дескриптора получают разделяемый доступ к одному и тому же целевому объекту. Если дескриптор передается с использованием конструктора перемещения [SWS_PER_00367] или оператора присваивания перемещением [SWS_PER_00368], исходный дескриптор переходит в инвалидированное состояние и больше не должен использоваться для доступа к хранилищу.
Текущее состояние дескриптора определяется явным оператором преобразования operator bool()[SWS_PER_00398]: он возвращает true, если имеется ссылка на действительный экземпляр хранилища, и false, если дескриптор пуст. Освобождение ресурсов дескриптора осуществляется через деструктор ~SharedHandle()[SWS_PER_00568]. Интерпретация: базовый ресурс хранения, по-видимому, освобождается, как только уничтожается последний ссылающийся SharedHandle. Вопрос Q-00a1798cf43e0ee6 (открытый)
Что касается параллелизма, операции доступа к инкапсулированному ресурсу через operator* ([SWS_PER_00402], [SWS_PER_00403]) и operator-> ([SWS_PER_00363], [SWS_PER_00364]), а также опрос состояния через operator bool()[SWS_PER_00398] являются потокобезопасными. Операции присваивания для одного и того же дескриптора ([SWS_PER_00368], [SWS_PER_00370]) и его уничтожение [SWS_PER_00568], напротив, не являются потокобезопасными и требуют внешней синхронизации при разделяемом использовании дескриптора.
Критические ошибочные состояния возникают преимущественно при недопустимых операциях над пустыми или инвалидированными дескрипторами. Согласно [SWS_PER_00398], вызов любых операторов, кроме operator bool(), на пустом дескрипторе непосредственно приводит к неопределенному поведению (Undefined Behavior). Это касается, в частности, исходных дескрипторов после перемещающего конструирования [SWS_PER_00367] или перемещающего присваивания [SWS_PER_00368], поскольку они инвалидируются и больше не должны использоваться.
Чтобы предотвратить неопределенное поведение, спецификация обязательно требует проверки состояния дескриптора с помощью operator bool() перед вызовом других операторов ([SWS_PER_00367], [SWS_PER_00368]). Все конструкторы, операторы присваивания, операторы доступа и деструктор объявлены как noexcept и специфицированы как безопасные относительно исключений («exception safe») ([SWS_PER_00367], [SWS_PER_00368], [SWS_PER_00369], [SWS_PER_00370], [SWS_PER_00363], [SWS_PER_00364], [SWS_PER_00402], [SWS_PER_00403], [SWS_PER_00398], [SWS_PER_00568]). Таким образом, недействительное состояние не вызывает исключения, а должно в обязательном порядке обрабатываться вызывающей стороной по возвращаемому значению operator bool().
Данное руководство основано на спецификации AUTOSAR для модуля per (Adaptive Platform, релиз R25-11) и создано ИИ-ассистентом курации.
Move constructor for SharedHandle. The source handle object is invalidated and cannot be used anymore. The operator bool() shall be used to check the state of a handle object before using any other operators of the handle object.
Move assignment operator for SharedHandle. The source handle object is invalidated and cannot be used anymore. The operator bool() shall be used to check the state of a handle object before using any other operators of the handle object.
Handle state. True if the handle represents a valid object of the templated class, False if the handle is empty (e.g. after a move operation). Using other operators than bool() of an empty handle will result in undefined behavior.
Move constructor for SharedHandle. The source handle object is invalidated and cannot be used anymore. The operator bool() shall be used to check the state of a handle object before using any other operators of the handle object.
Move assignment operator for SharedHandle. The source handle object is invalidated and cannot be used anymore. The operator bool() shall be used to check the state of a handle object before using any other operators of the handle object.
Handle state. True if the handle represents a valid object of the templated class, False if the handle is empty (e.g. after a move operation). Using other operators than bool() of an empty handle will result in undefined behavior.
gemini-3.8-flash-low· 2026-10-13 · Немецкий оригинал