我正在用 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()被调用时,我们将进入临界区两次,一次在Logger::warning()中,另一次在 *Logger::do_log()* 中。
如果您同意问题是真实存在的并且可能导致死锁,我该如何避免多个锁(使用 wxCriticalSection 类/宏)。