次の静的/グローバルを持つDLLがあるとします。
ClassA Object;
ClassAの実装に加えて、「通常の」ClassBも含まれています。これは、ClassAがまだ構築されていない場合は正しく機能しません(これが、ClassAを静的/グローバルにした理由です)。
Windowsでは、DLLローダーがClassBのコンストラクターの呼び出しでこのDLLをロードすると思いますよね?この時点で、ClassAが構築され、次にClassBの構築が続きます。2番目のスレッドがやって来てClassBを構築する場合、ClassAはすでに構築されているため、構築されません。
さて、私の質問は、ClassBが2つのスレッドによって同時に構築された場合はどうなるかということです。したがって、スレッド1はClassAの構築を開始します。スレッド2は、ClassBのコンストラクターを実行する前に、ClassAが完全に構築されるまで待機しますか?
言い換えると、LoadLibrary()はCriticalSectionを使用して、DLLの静的/グローバルのスレッドセーフな初期化を保証しますか?私の勘は「はい」ですが、いずれかの方法で述べているドキュメントが見つからないようです。