2

简而言之,我希望在尽可能靠近 main()/DllMain() 开头的地方进行特定的静态初始化。在静态初始化期间最后调用的构造函数可能是可以接受的。

由于这几乎肯定是特定于编译器的实现,因此我特别希望使用可视化 C++ 编译器(VS 2010 及更高版本)来执行此操作。将来我可能需要在 GCC 和 Clang 中执行此操作,但这不是一个直接的问题。

长话短说,我在基础库中有一个对象,该对象被静态初始化并在其构造函数中创建一个线程。该线程依赖于我们无法控制的库中的其他静态初始化对象,因此它会导致静态初始化中的竞争条件。如果我可以暂停或避免创建线程,直到所有其他静态初始化完成,这应该可以解决问题(一个简单的 Sleep(5000) 可以避免这个问题,尽管这不是一个可靠的解决方案)。

我可以在 main() 函数中显式调用初始化函数,但这并不理想,因为我们有 20 多个使用该库的二进制文件,因此每个程序员都必须记住在每个二进制文件中运行初始化。如果可能的话,我宁愿把这个责任推给编译器。

4

2 回答 2

2

上面Refugnic Eternium的评论是正确的,并提供了一种解决方案。

最好的解决方案是具有这样的功能:

BOOL InitMyLib();

MyLib.dll 中的所有函数和所有构造函数在调用它之前都应该失败。这样你就可以确保程序员不会忘记调用它。

于 2013-02-08T16:45:05.973 回答
0

创建一个初始化类,然后声明它的一个静态实例:

class MyInitializer
{
    public:
    MyInitializer ()
    {
        doInitStuffHere();
    }
};

static MyInitializer myInit;

您可以使用 来控制何时初始化静态变量#pragma init_seg。例如,#pragma init_seg(lib)。

使用 #pragma init_seg 控制静态构造 (KB104248)

于 2013-02-08T19:14:22.083 回答