Мне нужно написать класс, который загружает разделяемые библиотеки. Последовательности dlopen () / dlerror () нужна блокировка, чтобы быть потокобезопасной.
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;
Пользователи этого класса (их будет несколько одновременно) захотят сделать его статическим членом этого класса, чтобы избежать многократной загрузки разделяемой библиотеки для каждого объекта класса:
class NeedsALib {
public:
NeedsALib() { if (!myLib.IsLoaded()) { myLib.Load(); } }
private:
static LibLoader myLib;
}
LibLoader::myLib;
Проблема с этот код заключается в том, что он может / потерпит крах, потому что он зависит от порядка уничтожения статики при завершении программы. Если блокировка снята до myLib, произойдет сбой ....
Как это можно записать безопасным способом, обеспечивающим безопасность потоков и не зависящим от порядка статического уничтожения?