Ho bisogno di scrivere una classe che carichi le librerie condivise. La sequenza dlopen()/dlerror() ha bisogno di un lock per essere thread-safe.Scrittura di una classe C++ che può essere utilizzata come statica, ma richiede un blocco
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;
Gli utenti di questa classe (ci saranno molteplici allo stesso tempo) vorrà per renderlo un membro statico di questa classe per evitare il caricamento di una libreria condivisa di tempo multiplo per ogni oggetto della classe:
class NeedsALib {
public:
NeedsALib() { if (!myLib.IsLoaded()) { myLib.Load(); } }
private:
static LibLoader myLib;
}
LibLoader::myLib;
Il problema con questo codice è che si potrebbe arrestare/si interromperà, poiché si basa sull'ordine di statica che viene distrutto al termine del programma. Se il blocco è scomparso prima che myLib si blocca ....
Come può essere scritto in modo sicuro e sicuro e non si basa sull'ordine di distruzione statica?
... e la tua domanda è? –
@Jeremy: non mi piace che si arresti. ;-) Come può essere fatto meglio? –
Hai oggetti statici che devono caricare librerie condivise? –