16. Ресурсы в системе OpenSCADA (Res, ResAlloc, ResMtx, MtxAlloc, AutoHD) 
Большинство узлов и подсистем системы OpenSCADA являются динамическими, т.е. допускают создание/удаление/конфигурацию в процессе функционирования системы. Учитывая многопоточность системы, данная функциональность накладывает жесткие требования к синхронизации потоков. Для синхронизации в системе используются ресурсы, функции которых локализованы в объектах "Res" и "ResAlloc". Объект "Res" предоставляет хранилище ресурса, предусматривающего функции захвата/освобождения на чтение и запись. В объекте "ResAlloc" реализованы функции автоматического освобождения ресурса. Автоматический ресурс подразумевает создание локального объекта ресурса с автоматическим его освобождением при разрушении (в деструкторе). Использование автоматических ресурсов значительно упрощает работу с ресурсами при использовании исключений.
Любой динамический объект системы наследуется от объекта "TCntrNode", который содержит механизм подключения через шаблон "AutoHD". Основной функцией шаблона является хранение ссылки на объект и захват ресурса, исключающего удаление объекта на момент использования. Шаблон поддерживает копирование ресурса и автоматическое его освобождение в случае разрушения объекта шаблона. Для наглядности доступа к объектам порождённым от "TCntrNode" шаблон "AutoHD" поддерживает приведение типов, основанное на динамическом приведении.
 16.1. Объект R/W ресурса (ResRW) 
Публичные методы:
-  ResRW( ); — Инициализация ресурса.
 -  static void resRequestW( long tm = 0 ); — Запрос ресурса на запись/модификацию с таймаутом ожидания tm (в миллисекундах).
 -  bool resTryW( ); — Попытка захвата ресурса на запись/модификацию. При успешном захвате возвращает "true" иначе "false".
 -  static void resRequestR( long tm = 0 ); — Запрос ресурса на чтение  с таймаутом ожидания tm (в миллисекундах).
 -  bool resTryR( ); — Попытка захвата ресурса на чтение. При успешном захвате возвращает "true" иначе "false".
 -  static void resRelease( ); — Освобождение ресурса.
 
 16.2. Объект автоматического освобождения R/W ресурса (ResAlloc) 
Публичные методы:
-  ResAlloc( ResRW &rid ); — Инициализация автоматически освобождающегося ресурса для ранее выделенного идентификатора rid.
 -  ResAlloc( ResRW &rid, bool write, long tm = 0 ); — Инициализация автоматически освобождающегося ресурса для ранее выделенного идентификатора rid. С указанием типа ресурса write (чтение/запись).
 -  void request( bool write = false, long tm = 0 ); void lock( bool write = false, unsigned short tm = 0 ); — Запрос ресурса в указанном режиме write (чтение/запись).
 -  void release( ); void unlock( ); — Освобождение ресурса.
 
 16.3. Шаблон (AutoHD) 
Публичные методы:
-  AutoHD( ); — Инициализация без привязки к объекту.
 -  AutoHD( ORes *node, const string &who = "" ); — Инициализация с привязкой к объекту node. Объект должен содержать функцию AHDConnect() и AHDDisConnect().
 -  AutoHD( const AutoHD &hd ); — Копирующий конструктор.
 -  template <class ORes1> AutoHD( const AutoHD<ORes1> &hd_s ); — Конструктор приведения типов в безопасном режиме приведения (посредством dynamic_cast). Возвращает свободный ресурс в случае невозможности приведения.
 -  ORes &at( ) const; — Получение объекта за ресурсом. 
 -  AutoHD &operator=(const AutoHD &hd); — Копирование ресурсов.
 -  bool operator==(const AutoHD &hd); — Сравнение объектов за ресурсом по указателю.
 -  void free( ); — Освобождение ресурса.
 -  bool freeStat( ) const; — Признак "Ресурс свободен".
 
 16.4. Объект захвата ресурсов, мютексом (ResMtx) 
Публичные методы:
-  ResMtx( bool isRecurs = false ); — Инициализация объекта мютекса с рекурсией isRecurs.
 -  void lock( ); — Захват мютекса. Возврат нуля в случае успеха.
 -  void unlock( ); — Освобождение мютекса. Возврат нуля в случае успеха.
 -  int tryLock( ); — Проба захвата мютекса, без ожидания освобождения. Возврат нуля в случае успеха.
 -  pthread_mutex_t &mtx( ); — Прямая ссылка на структуру мютекса.
 
 16.5. Объект строки с доступом, разделённым ресурсом (ResString) 
Публичные методы:
-  explicit ResString( const string &vl = "" ); — Инициализация строки с указанным значением vl.
 -  ResString &operator=( const string &val ); — Функция неявного преобразования из std::string.
 -  operator string( ); — Функция неявного преобразования в std::string.
 -  size_t size( ); — Размер строки.
 -  bool empty( ); — Строка пуста.
 -  void setVal( const string &vl ); — Установка значения строки в vl.
 -  const string &getVal( ); — Получение значения строки.
 -  const string &getValRef( ); — Получение прямой ссылки на строку std::string. Ресурс игнорируется в случае использования этой функции!
 
 16.6. Объект условной переменной, по мютексу (CondVar) 
Публичные методы:
-  CondVar( ); — Инициализация условной переменной.
 -  int wait( ResMtx &mtx, unsigned short tm = 0 ); — ожидание пробуждения по условной переменной с таймаутом tm и мютексом mtx.
 -  int wakeOne( ); — пробуждение одного потока.
 -  int wakeAll( ); — пробуждение всех потоков.
 
 16.7. Объект автоматического освобождения POSIX мютекса (MtxAlloc) 
Публичные методы:
-  MtxAlloc( ResMtx &iM, bool lock = false ); — Инициализация автоматически освобождающегося мютекса для ранее выделенного идентификатора iM. С указанием блокировки lock при создании.
 -  int lock( ); — Захват ресурса. Возврат нуля при успешном выполнении.
 -  int unlock( ); — Освобождение ресурса. Возврат нуля при успешном выполнении.
 -  int tryLock( ); — Проба захвата ресурса, без ожидания освобождения. Возврат нуля при успешном выполнении.
 
 16.8. Объект строки с доступом, разделённым глобальным ресурсом(мютексом) данных (MtxString) 
Публичные методы:
-  MtxString( ResMtx &iM ); — Инициализация строки с разделением доступа ресурсом iM.
 -  MtxString &operator=( const string &val ); — Функция неявного преобразования из std::string.
 -  operator string( ); — Функция неявного преобразования в std::string.
 -  size_t size( ); — Размер строки.
 -  bool empty( ); — Строка пуста.
 -  void setVal( const string &vl ); — Установка значения строки в vl.
 -  const string &getVal( ); — Получение значения строки.
 -  const string &getValRef( ); — Получение прямой ссылки на строку std::string. Ресурс игнорируется в случае использования этой функции!