1

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 クラス/マクロを使用)。

4

1 に答える 1