MFCのアプリで排他制御のルーチンを作っていて疑問に思ったことなのですが、
CやC++の仕組みのことなので、こちらで質問させていただきます。

複数のスレッドから呼ばれる関数の内部は、
CCriticalSectionを使って排他制御しています。

void Test()
{
  static CCriticalSection cs;
  cs.Lock();
  :
  cs.Unlock();
}

関数内のstatic変数は、その関数が初めて呼ばれたときに
実体が作成されると理解しているのですが、
1回目のTest()でCCriticalSectionのコンストラクタを実行している最中に
他のスレッドがTest()を呼んだ場合、このコンストラクタ自体は、
正しく排他制御されるのでしょうか?
コンストラクタが終わるまで、他のスレッドは待ってくれるのでしょうか?

それとも、CCriticalSectionの変数は、
関数の外に置かなくてはいけないものでしょうか?

MFCの内部でも、AFXPlaySystemSound()などで
同じようなことをやっているようなのですが。