Potrzebuję napisać klasę, która ładuje biblioteki współdzielone. Sekwencja dlopen()/dlerror() potrzebuje blokady, aby była bezpieczna dla wątków.Zapisywanie klasy C++, która może być używana jako statyczna, ale wymaga blokady
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;
Użytkownicy tej klasy (nie będzie wielokrotnością w tym samym czasie) będzie chciał, aby to statyczne członkiem tej klasy, aby uniknąć ładowania wspólna Biblioteka czas dla każdego obiektu klasy:
class NeedsALib {
public:
NeedsALib() { if (!myLib.IsLoaded()) { myLib.Load(); } }
private:
static LibLoader myLib;
}
LibLoader::myLib;
Problem z tym kodem polega na tym, że może się zawieść, ponieważ opiera się na kolejności niszczenia statyki po zakończeniu programu. Jeśli blokada zniknie, zanim myLib się zawiesza ...
Jak można to napisać w bezpieczny sposób, który jest bezpieczny dla wątków i nie polega na kolejności statycznego zniszczenia?
... a twoje pytanie brzmi? –
@Jeremy: Nie podoba mi się, że się rozbił. ;-) Jak to zrobić lepiej? –
Czy masz statyczne obiekty, które muszą załadować biblioteki współdzielone? –