2009-12-06 5 views
9

Estamos desarrollando una aplicación que tendrá una "arquitectura" de plug-in para permitir a los consumidores de la aplicación proporcionar sus propios algoritmos de propiedad. (Tendremos básicamente un conjunto de analizadores y permitiremos que terceros proporcionen los suyos también)Recomendación para C++ wrapper para enlaces de biblioteca dinámica en proceso multiplataforma (es decir, COM o CORBA ligeros, de alto rendimiento)

El espacio de dominio requiere un rendimiento muy alto, por lo que las uniones fuera de proceso no van a funcionar y preferimos dejarlo las cosas de peso pesado como CORBA y COM solo.

Básicamente estamos buscando un simple envoltorio multiplataforma en torno a: biblioteca de carga

  • de una ruta relativa
  • proporcionar un mapeo de la DLL en particular/.so a alguna configuración/Nombre
  • hacer algo de inicialización y consultar la biblioteca para asegurarse de que proporciona la funcionalidad necesaria

Creo que esto es realmente sólo una envoltura alrededor de LoadLibrary() y las llamadas a métodos exportado. Podemos escribir esto nosotros mismos, pero preferimos usar el código existente ya que tenemos suficiente en nuestro plato.

De nuevo, el rendimiento y el rendimiento son muy importantes.

preguntas similares son:

Cross-platform alternative to COM - éste está cerca, pero nosotros queremos en proceso solamente - no hay necesidad de salir del proceso y nuestras necesidades son un poco "peso más ligero".

C++ Cross Platform Dynamic Libraries; Linux and Windows

Esto es para C++ no administrado - no podemos utilizar .NET

EDITAR - lo que encontramos

Encontramos que Poco funciona muy bien para nuestras necesidades. Como una bonificación This page es un comentario muy apreciado sobre el estado del desarrollo de C++ y la dirección del idioma ...

Era una envoltura cruzada de plataforma simple que necesitábamos que proporciona Poco. Realmente no hay mucho para eso, pero aun así nos ahorra tiempo y pruebas. Sin sobrecarga adicional durante el tiempo de ejecución.

+1

Yo no creo que nadie se ha molestado en hacer esto de forma explícita en el proceso. XPCOM es lo mejor que se te viene a la mente. –

+0

poco parece hacer el truco – Tim

+0

@Tim: Mi comentario está más bien relacionado con la idea de _una "arquitectura" de complemento para permitir a los consumidores de la aplicación proporcionar sus propios algoritmos propietarios. Por lo tanto, mi proyecto apunta a la misma funcionalidad, pero tiene un problema grave: si el código de usuario pasa por un bucle infinito, el hilo, en el que se ejecuta el código usado, bloquea un núcleo de la CPU y, por lo tanto, reduce el rendimiento. De alguna forma, este hilo debe ser detenido. Entonces, ¿tienes el mismo problema? Si es así, ¿cuál es su solución? –

Respuesta

4

La biblioteca ACE contiene envoltorios para la carga dinámica de bibliotecas que funcionan en varias plataformas. Si desea más comodidad que la biblioteca de carga normal, consulte TAO The ACE ORB. El uso de corba con TAO es extremadamente eficaz y probablemente sea mejor que cualquier infraestructura de complementos diseñada especialmente, especialmente si utiliza llamadas de proceso, ya que TAO las optimiza.

Para usar la envoltura dinámica de plataforma multiplataforma utilice ACE_DLL. Proporciona la envoltura de plataforma cruzada más básica alrededor de loadlibrary() que mencionaste.

Entre usar ACE_DLL y usar TAO está el service configuration framework de ACE que le permite cargar objetos dinámicamente. Después de cargar, puede obtener un puntero de subida al objeto cargado que implementó y puede llamar a cualquier método en el objeto cargado.

El código para hacer que se vería así:

char const * const cpc_myClass = ACE_DYNAMIC_SERVICE_DIRECTIVE(
    "myclass", 
    "dllname", 
    "_make_MyClass", 
    "" 
); 
result = ACE_Service_Config::process_directive(cpc_myClass); 
MyClass * p_obj = ACE_Dynamic_Service<MyClass>::instance ("myclass"); 
p_obj->callAnyMethodYouLike(); 

Here se explica que TAO conoce dos tipos de optimización de colocación (thru_poa y directos):

Cuando se utiliza la estrategia directa, Las invocaciones de métodos en objetos colocados se convierten en llamadas directas al servidor sin verificar el estado del POA.

Es posible que se sorprenda de cuán efectivo puede ser TAO si se usa correctamente. Sugiero crear una prueba simple de concepto y hacer mediciones.

+0

Estoy familiarizado con ACE. Sin embargo, no necesito el proceso cruzado "pesado" o las encuadernaciones cruzadas. No me puedo imaginar que ACE esté cerca de la realización de una llamada virtual. ¿Cuál es la sobrecarga de una llamada ACE? – Tim

+1

Si usa la clase ACE_DLL, no hay llamadas de proceso cruzadas. ¿Quizás no estás lo suficientemente familiarizado con ACE? Incluso con TAO puede generar una asignación "directa" que básicamente hace solo una llamada virtual cuando el objeto llamado está en el mismo proceso. – lothar

+0

+1 Sí, utilicé ACE como una implementación de corba, no como ace_dll, gracias por la sugerencia – Tim

Cuestiones relacionadas