call_once с Once_flag, разделяемым между DLL - PullRequest
0 голосов
/ 19 марта 2012

У меня есть класс, использующий std :: call_once () и std :: Once_flag для ленивой инициализации статических данных в классе во время первого использования конструктора класса. Таким образом, Once_flag является статическим членом класса. Моя проблема в том, что я не знаю лучшего способа поделиться этим между основным приложением и различными библиотеками DLL, которые приложение загружает и выгружает в разное время.

Единственная идея, которую я имел, состояла в том, чтобы экспортировать версию EXE-класса класса std::once_flag *GetOnceFlag(), который возвращает адрес статического Once_flag, тогда как класс в DLL будет использовать call_once () с GetOnceFlag (): MyClass::Myclass(void) { call_once(*GetOnceFlag(), &MyClass::Init, this); } Подойдет ли этот подход?

Недостатком является то, что каждый раз, когда ctor будет вызывать GetOnceFlag (), что неэффективно для облегченного ctor (в моем случае, это не делает ничего, кроме call_once ()). Но я не уверен, является ли гонка, подразумеваемая кэшированием указателя, как в MyClass::Myclass(void) { if (!_pflag) _pflag = GetOnceFlag(); call_once(*_pflag, &MyClass::Init, this); }, проблемой или нет (запись указателя является атомарной на всех интересующих меня платформах, поэтому, если GetOnceFlag () вызывается одновременно, я думаю все должно быть в порядке, но я не совсем уверен).

Комментарии и лучшие решения приветствуются.

РЕДАКТИРОВАТЬ: Я знаю, что общий класс может быть помещен в отдельную DLL, которую используют другие, но разве это не влияет на генерацию кода оптимизации всей программы / времени компоновки, что делает MSVC? Я предполагаю, что межмодульная оптимизация, упомянутая в документации для / GL и / LTCG, касается только отдельных объектов и статических библиотек, которые связаны, и не может происходить через границы DLL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...