简而言之,我希望一段特定的静态初始化尽可能靠近main()/DllMain()的开头。这可能是一个在静态初始化期间最后调用的构造函数。
由于这几乎肯定是一个特定于编译器的实现,我特别希望使用visual C++编译器(VS 2010及以后版本)来实现这一点。在未来,我可能需要在GCC和Clang这样做,但这不是当务之急。
长话短说,我在一个基本库中有一个对象,它被静态初始化,并在其构造函数中创建一个线程。这个线程依赖于我们不控制的库中其他静态初始化的对象,因此它在静态初始化中会导致竞争条件。如果我可以暂停或避免创建线程,直到所有其他静态初始化完成,这应该可以解决问题(简单的Sleep(5000)可以避免这个问题,尽管这不是一个可靠的解决方案)。
我可以在main()函数中显式调用initialize函数,但这并不理想,因为我们有20多个二进制文件使用这个库,所以每个程序员都必须记住在每个二进制文件中运行初始化。如果可能的话,我更愿意把这个责任推给编译器。
Refugnic Eternium上面的注释是正确的,并且提供了一个解决方案。
最好的解决方案是具有这样的功能:
BOOL InitMyLib();
MyLib.dll中的所有函数以及所有
创建一个初始化器类,然后声明它的静态实例:
class MyInitializer
{
public:
MyInitializer ()
{
doInitStuffHere();
}
};
static MyInitializer myInit;
当使用#pragma init_seg
初始化静态变量时,您可以控制。例如,#pragma init_seg(lib)。
使用#pragma init_seg控制静态构造(KB104248)