简而言之,我希望一个特定的静态初始化尽可能接近main()/ DllMain()的开头。在静态初始化期间,这可能是一个名为last的构造函数。
由于这几乎肯定是特定于编译器的实现,我特别希望使用visual C ++编译器(VS 2010及更高版本)来实现这一点。将来我可能需要在GCC和Clang这样做,但这不是一个直接关注的问题。
长话故事是我在基础库中有一个静态初始化的对象,并在其构造函数中创建一个线程。此线程依赖于我们无法控制的库中的其他静态初始化对象,因此它会在静态初始化中导致争用条件。如果我可以暂停或避免创建线程,直到所有其他静态初始化完成,这应该解决问题(一个简单的Sleep(5000)避免了这个问题,虽然这不是一个强大的解决方案)。
我可以在main()函数中显式调用initialize函数,但是这并不理想,因为我们有20多个二进制文件使用这个库,因此每个程序员都必须记住在每个二进制文件中运行初始化。如果可能的话,我宁愿把这个责任推到编译器上。
答案 0 :(得分:2)
以上Refugnic Eternium的评论是正确的,并提供了一种解决方案。
最好的解决方案是拥有这样的功能:
BOOL InitMyLib();
MyLib.dll中的所有函数和所有构造函数都应该失败,直到调用它为止。这样你就可以确保程序员不要忘记调用它。
答案 1 :(得分:0)
创建一个初始化类,然后声明它的静态实例:
class MyInitializer
{
public:
MyInitializer ()
{
doInitStuffHere();
}
};
static MyInitializer myInit;
使用#pragma init_seg
初始化静态变量时,可以控制。例如,#pragma init_seg(lib)。
Use #pragma init_seg to Control Static Construction (KB104248)