私は実際に大きな問題に直面しています: シングルトン クラスがあります。私のプログラムはマルチスレッド MFC であるため、シングルトンのコンストラクターは異なるスレッドから呼び出すことができます。シングルトン インスタンス ゲッター関数をミューテックスで囲み、デッドロックや複数の構造を回避しました。以下の意味する関数の呼び出しは、最初は直接失敗します。
関数は次のようになります (LOG_MSG マクロは、指定された文字列をログ ファイルに記録します)。
MyClass& MyClass::singleton ()
{
LOG_MSG("MyClass::singleton -> jump in");
static CMutex oInitMutex;
try
{
CSingleLock oSingleLock((CSyncObject *) &oInitMutex, TRUE);
LOG_MSG("!!! SINGLETON LOCK OKAY !!!");
static MyClass oMyClassInstance;
LOG_MSG("!!! SINGLETON CONSTRUCTION OKAY !!!");
return oMyClassInstance;
}
catch(...)
{
CString excMsg("Unexpected exception by creating MyClass singleton instance!");
LOG_MSG(excMsg);
throw excMsg;
}
}
シングルトンオブジェクトの構築は失敗しないことがわかりました(「!!! SINGLETON CONSTRUCTION OKAY !!!」というメッセージが表示されるため)。
ログ出力は次のように述べています。
09.04.2013 ;07:14:51:832;"MyClass::singleton -> jump in"
09.04.2013 ;07:14:51:841;"!!! SINGLETON LOCK OKAY !!!"
... (constructor logs => NOTHING unexpected in it!!! everything runs fine, as they must!!!)
09.04.2013 ;07:14:52:125;"!!! SINGLETON CONSTRUCTION OKAY !!!"
09.04.2013 ;07:14:52:170;"Unexpected exception by creating MyClass singleton instance!"
どういう意味ですか?returnステートメントが例外をスローするのはいつですか??? この問題を解決するのを手伝ってください...