Re: thread safe collection view
От: B0FEE664  
Дата: 13.12.22 11:52
Оценка: 12 (2)
Здравствуйте, pva, Вы писали:

pva>подскажите как бы вы решали такую задачу или может библиотеку, которая реализует что-то подобное:

pva>коллекция данных (list/vector) к которой необходимо обеспечить потокобезопасный доступ через "виды".
pva>Вобщем, некий аналог SQL View, когда поверх сырых данных обеспечивается фильтрованный доступ к содержимому коллекции.
pva>Помимо потокобезопасности хотелось бы возможность регистрировать колбек или другой механизм уведомления об изменении

Я бы сделал как здесь
Автор: Kernan
Дата: 13.07.22
, только вместо std::mutex следует использовать std::shared_mutex.
Должно получится что-то вроде:
template<typename T>
class SafeData
{
   public:
      template<class Fn>
      auto Transform(Fn&& op) // запись
      {
         std::unique_lock lock( mtx );
         return op(data);
      }
   private:
      template<class Fn>
      auto ConstAccess(Fn&& fnAccess) const
      {
         return fnAccess(data);
      }
   public:
      template<class Fn>
      auto Access(Fn&& fnAccess) // только чтение
      {
         static_assert( ! std::is_reference<decltype(fnAccess(data))>::value, "no references");
         static_assert( ! std::is_pointer<decltype(fnAccess(data))>::value  , "no pointers");

         std::shared_lock lock( mtx );
         return ConstAccess(std::forward<Fn>(fnAccess));
      }
   private:
      std::shared_mutex  mtx;
      T                  data;
};

— осторожно, я это не тестировал и даже не компилировал. Просто эту задачу я бы решал примерно так.
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.