C++ 使用跨DLL共享的once_标志调用_once

C++ 使用跨DLL共享的once_标志调用_once,c++,dll,thread-safety,c++11,lazy-initialization,C++,Dll,Thread Safety,C++11,Lazy Initialization,我有一个使用std::call_once()和std::once_标志的类,用于在第一次使用类构造函数期间延迟初始化类中的静态数据。因此,once_标志是类的静态成员。我的问题是,我不知道在主应用程序和应用程序在不同时间加载和卸载的各种DLL之间共享此信息的最佳方式 我唯一的想法是让EXE版本的类导出一个std::once_flag*GetOnceFlag(),它返回静态once_标志的地址,而DLL中的类将使用call_once()和GetOnceFlag():MyClass::MyClass

我有一个使用std::call_once()和std::once_标志的类,用于在第一次使用类构造函数期间延迟初始化类中的静态数据。因此,once_标志是类的静态成员。我的问题是,我不知道在主应用程序和应用程序在不同时间加载和卸载的各种DLL之间共享此信息的最佳方式

我唯一的想法是让EXE版本的类导出一个
std::once_flag*GetOnceFlag()
,它返回静态once_标志的地址,而DLL中的类将使用call_once()和GetOnceFlag():
MyClass::MyClass(void){call once(*GetOnceFlag(),&MyClass::Init this)}
这种方法有效吗

缺点是每次ctor都会调用GetOnceFlag(),这对于轻量级ctor来说效率很低(在我的例子中,它只调用call_once())。但是我不确定在
MyClass::MyClass(void){if(!\u pflag)\u pflag=GetOnceFlag();call_once(*\u pflag,&MyClass::Init,this);}
中缓存指针所隐含的竞争是否是一个问题(指针写入在我感兴趣的所有平台上都是原子的,所以如果GetOnceFlag()同时被调用,我认为应该可以,但我不能完全确定)

欢迎提出意见和更好的解决方案


编辑:我知道共享类可以放在其他人使用的单独DLL中,但这不会影响MSVC所做的整个程序优化/链接时间代码生成吗?我假设/GL和/LTCG文档中提到的跨模块优化只针对链接的单个对象和静态库,不能跨DLL边界进行。

这真的需要优化吗?你说的是简单的函数调用开销。目前还不清楚缓存是否会解决这个问题,或者只是让其他事情变得更慢。另外,您保证只调用一个
MyClass::Init
(DLL初始化)。这不应该是.exe的一部分吗?在这种特殊情况下,它会起作用。Init()将被调用一次,但它应该在第一次使用时被调用(毕竟,这就是延迟初始化的含义),它将在运行时加载的一个DLL中。是的,但通常每个DLL都需要初始化。您不希望只
Init
一个DLL,而从不为其他DLL调用
Init
,这是常见的
once\u标志所做的。