Написание класса C ++, который может использоваться как статический, но требует блокировки

Мне нужно написать класс, который загружает разделяемые библиотеки. Последовательности 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, произойдет сбой ....

Как это можно записать безопасным способом, обеспечивающим безопасность потоков и не зависящим от порядка статического уничтожения?

6
задан andand 26 November 2011 в 05:06
поделиться