C++ でシングルトン Logger クラスを作成しています。このクラスは、ロギング API を複数のスレッドに提供します。スレッド セーフにするために、wxCRIT_SECT_LOCKERマクロを使用しています。
Logger クラスに次の関数があるとします (簡単な例)。
void Logger::error( string msg )
{
wxCRIT_SECT_LOCKER(adapter_locker, gs_LogBufferShield);
// do something such as getting/setting class members
m_err_cnt++;
do_log("Error: " + msg);
}
void Logger::warning( string msg )
{
wxCRIT_SECT_LOCKER(adapter_locker, gs_LogBufferShield);
// do something such as getting/setting class members
m_warn_cnt++;
do_log("Warning: " + msg);
}
void Logger::do_log( string msg )
{
wxCRIT_SECT_LOCKER(adapter_locker, gs_LogBufferShield);
// do something such as getting/setting class members
m_log_cnt++;
cout << msg << endl;
}
問題:
Logger::warning()が呼び出されると、クリティカル セクションに 2 回入ります。1 回目はLogger::warning()で、もう 1 回は *Logger::do_log()* です。
問題が現実のものであり、デッドロックを引き起こす可能性があることに同意する場合、複数のロックを回避するにはどうすればよいですか (wxCriticalSection クラス/マクロを使用)。