Asegurar solo una sola instancia de miembro de la clase de plantilla estática -- ++ campo con thread-safety campo con template campo con singleton campo con static camp codereview Relacionados El problema

Ensure only a single instance of static template class member


3
vote

problema

Español

Estoy interactuando con una biblioteca C, cuya documentación establece que ciertas funciones no son de seguridad. Dado que sus funciones tratan heterogéneamente con múltiples tipos, he escrito una envoltura de plantilla para usarla de manera homogénea de C ++. Sin embargo, ahora necesito garantizar el acceso serializado a ciertas funciones, serializadas en todos los envoltorios de plantillas instantáneadas.

Creo que el siguiente enfoque debería trabajar Lo que me gustaría saber es, hay advertencias para el siguiente enfoque, y si es así, ¿qué son y cómo puedo conseguirlos?

  struct LibMutexPolicy {     static std::mutex & getMutexInstance()     {         static std::mutex inst;         return inst;     } };  template <typename T> struct A : private LibMutexPolicy {     void foo()     {         std::lock_guard<std::mutex> lock(getMutexInstance());         // Call non thread-safe library code     } };   
Original en ingles

I am interacting with a C library, whose documentation states that certain functions are not thread safe. Since its functions deal heterogeneously with multiple types, I have written a template wrapper to use it in a homogeneous manner from C++. However, I now need to ensure serialized access to certain functions, serialized across all instantiated template wrappers.

I believe the following approach should work; what I would like to know is, are there any caveats to the following approach, and if so, what are they and how can I get around them?

struct LibMutexPolicy {     static std::mutex & getMutexInstance()     {         static std::mutex inst;         return inst;     } };  template <typename T> struct A : private LibMutexPolicy {     void foo()     {         std::lock_guard<std::mutex> lock(getMutexInstance());         // Call non thread-safe library code     } }; 
              
       
       

Lista de respuestas

4
 
vote
vote
La mejor respuesta
 

Creo que el siguiente enfoque debería funcionar; Lo que me gustaría saber es, ¿hay alguna advertencia para el siguiente enfoque, y si es así, qué son y cómo puedo conseguirlos?

Considerar una implementación de decoradores, con una función de visitante para el acceso al método:

  parsedMessage1  

Código del cliente:

  parsedMessage2  

Acceso de hilo:

  parsedMessage3  

El código está incompleto (necesitaría una especialización de sincronización para el acceso const y así sucesivamente), pero debería ser suficiente para darle una foto.

Ventajas:

  • Este es un decorador no intrusivo que puede usar en prácticamente cualquier tipo

  • separa bien las preocupaciones y le permite implementarlas y probarlas por separado (por ejemplo, la prueba A, luego probar el código de sincronización)

Desventaja menor:

  • El acceso a los métodos de AX requiere LAMBDAS / FUNCIONES EXTERNAS
 

I believe the following approach should work; what I would like to know is, are there any caveats to the following approach, and if so, what are they and how can I get around them?

Consider a decorator implementation, with a visitor function for method access:

template<typename V> class threadsafe_reference // decorator { public:     using reference_type = V&;     threadsafe_reference(reference_type v, std::mutex& m): value_(v), mutex_(m) {}      // synchronized visitor access     void sync( std::function<void(value_type&)> functor )     {         std::lock_guard<std::mutex> lock{ mutex_ };         functor( value_ );     }      // you may wish to provide unsynchronized reference access here private:     reference_type value_;     std::mutex& mutex_;  };  template<typename V> threadsafe_reference<V> make_threadsafe(V& value, std::mutex& m) {     return threadsafe_reference<V>{ value, m }; }  

Client code:

struct A // agnostic to threading {     void do_stuff_n_things( int i ) {}; };  A a; // need to pass this on two threads mutex m;  auto tsa = make_threadsafe(a, m); // proxy accessor 

Thread access:

 tsa.sync( []( A& self ) { self.do_things_n_stuff(10); } ); 

The code is incomplete (you'd need a specialization of sync for const access and so on) but it should be enough to give you a picture.

Advantages:

  • this is a non-intrusive decorator that you can use over virtually any type

  • separates concerns nicely and allows you to implement and test them separately (e.g. test A, then test the synchronization code)

Minor disadvantage:

  • the access to A's methods requires lambdas/external functions
 
 

Relacionados problema

10  Imitación básica de C # enumerable en VBA - o cualquier otra clase estática  ( Basic imitation of c enumerable in vba or any other static class ) 
Desde la implementación de clases estáticas en VBA en realidad parece posible Se me ocurrió una idea para tratar de imitar C # ' 9988776655544330 clase ...

3  Navegador web en swing con MVC  ( Web browser in swing with mvc ) 
Pregunta de seguimiento a: Utilizando OOP al crear un navegador web Después de recibir la ayuda en la pregunta anterior, he creado 3 clases para mi Brows...

4  Extensiones primitivas: reemplaza los métodos primitivos estáticos  ( Primitive extensions replaces static primitive methods ) 
Me molestó tener que hacer cosas como string.IsNullOrEmpty(myString) Cuando parecía que 9988776665544337 es suficiente. Por lo tanto, escribí una pequeña ...

5  Reflexión y proyecto EULER  ( Reflection and project euler ) 
He hecho un corredor de Project Euler para facilitar el funcionamiento de los diversos problemas. Nunca antes había usado la reflexión, y creo que he encontra...

2  ¿Cómo puedo mejorar este código sin usar estática o singleton? [cerrado]  ( How can i improve this code without using static or singleton ) 
cerrado. Esta pregunta es off-topic . Actualmente no está aceptando respuestas. ¿Quieres ...

4  Aplicación de Android para enviar solicitudes de nombre de usuario y contraseña  ( Android app for sending username and password requests ) 
Estoy desarrollando una aplicación de Android que realiza varias solicitudes a un servidor utilizando la androidasynchronoushttpclient . Una de estas solici...

7  Uso de una clase estática para un motor de juego  ( Use of a static class for a game engine ) 
He estado diseñando un motor de juego durante los últimos meses con pequeños problemas. Sin embargo, un objetivo principal con este proyecto es ponerlo en mi ...

5  Configuración de Tostring a través de una variable estática pública  ( Configuring tostring via a public static variable ) 
A veces necesito toString() para ser bastante verboso, normalmente no lo hago. No se puede resolver muy bien mediante el uso de otros métodos como toString...

2  Reflexión de Java y Clases estáticas  ( Java reflection and static classes ) 
Intento interceptar algunas llamadas OpenGL para probar mis clases de representación. La reflexión se utiliza para reemplazar el backend de OpenGL. Siento q...

3  Valores de búsqueda en caché en un sitio web de comercio electrónico  ( Caching lookup values in an e commerce website ) 
Estoy trabajando en un sitio web de comercio electrónico. Tengo un desplegamiento 99887766555443344 que contiene nombres de automóviles y su ID correspondie...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos