2

要するに、静的初期化の特定の部分を main()/DllMain() の先頭にできる限り近づけて発生させたいと考えています。これが、静的初期化中に最後に呼び出されるコンストラクタであることは、おそらく許容されるでしょう。

これはほぼ確実にコンパイラ固有の実装になるため、ビジュアル C++ コンパイラ (VS 2010 以降) を使用してこれを行うことを特に検討しています。将来的には、おそらく GCC と Clang でこれを行う必要があるでしょうが、それは差し迫った問題ではありません。

長い話は、静的に初期化され、コンストラクターでスレッドを作成する基本ライブラリーにオブジェクトがあるということです。このスレッドは、ライブラリ内の他の静的に初期化されたオブジェクトに依存しているため、静的初期化で競合状態が発生します。他のすべての静的初期化が完了するまでスレッドの作成を一時停止または回避できる場合、これで問題が解決するはずです (単純な Sleep(5000) で問題が回避されますが、これは厳密な解決策ではありません)。

main() 関数で初期化関数を明示的に呼び出すこともできますが、このライブラリを使用する 20 以上のバイナリがあるため、これは理想的ではありません。可能であれば、この責任をコンパイラに押し付けたいと思います。

4

2 に答える 2

2

上記の Refugnic Eternium のコメントは正しく、1 つの解決策を提供します。

最善の解決策は、次のような関数を持つことです。

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 に答える