Necesito escribir una clase que cargue bibliotecas compartidas. La secuencia dlopen()/dlerror() necesita un bloqueo para ser seguro para hilos.Escribir una clase de C++ que se puede usar como estática, pero necesita un bloqueo
class LibLoader {
public:
LibLoader(string whichLib);
bool Load() { Wait(lock); ... dlopen() ... dlerror() ... }
bool Unload() { Wait(lock); ... dlclose() ... dlerror() ... }
bool IsLoaded() {...}
// ... access to symbols...
private:
static Lock lock;
}
Lock Lock::lock;
Los usuarios de esta clase (no serán múltiples al mismo tiempo) va a querer que sea un miembro estático de esta clase para evitar cargar una biblioteca compartida tiempo múltiple para todos los objetos de la clase:
class NeedsALib {
public:
NeedsALib() { if (!myLib.IsLoaded()) { myLib.Load(); } }
private:
static LibLoader myLib;
}
LibLoader::myLib;
El problema con este código es que puede/se bloqueará, ya que depende del orden de la estática que se destruye cuando finaliza el programa. Si el bloqueo se va antes de que myLib se bloquee ...
¿Cómo se puede escribir de forma segura que es seguro para la ejecución de subprocesos y no depende del orden de destrucción estática?
... y tu pregunta es? –
@Jeremy: No me gusta que se cuelgue. ;-) ¿Cómo se puede hacer esto mejor? –
¿Tiene objetos estáticos que necesitan cargar bibliotecas compartidas? –