如何在使用wxCRIT_SECT_LOCKER时防止死锁
how to prevent deadlock when using wxCRIT_SECT_LOCKER
我正在用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()时,我们将进入关键部分两次,一次在Recorder::warning()[/em>中,另一次在*Logger:∶do_log()*中。
如果你同意这个问题是真实的,并且可能导致死锁,我如何避免多个锁(使用wxCriticalSection类/宏)。
通常要做的是创建不接受锁的内部API,这些API由接受锁的公共API调用。
void Logger::error( string msg )
{
wxCRIT_SECT_LOCKER(adapter_locker, gs_LogBufferShield);
m_err_cnt++;
do_log_internal("Error: " + msg);
}
void Logger::warning( string msg )
{
wxCRIT_SECT_LOCKER(adapter_locker, gs_LogBufferShield);
m_warn_cnt++;
do_log_internal("Warning: " + msg);
}
void Logger::do_log( string msg )
{
wxCRIT_SECT_LOCKER(adapter_locker, gs_LogBufferShield);
do_log_internal(msg);
}
void Logger::do_log_internal( string msg )
{
m_log_cnt++;
cout << msg << endl;
}
但是,对于您的问题,您可以直接使用wxMutex
,并在构造它时使用类型wxMUTEX_RECURSIVE
。这样,互斥体就有了计数。当互斥锁第一次被锁定时,计数被设置为1。如果同一个线程再次获取互斥锁,它会增加一个计数。释放互斥会减少计数。当计数达到0时,互斥锁被解锁。
相关文章:
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- 用C++中的std::condition_variable将线程置于死锁中会有风险吗
- 使用 std::async 时死锁,将来作为成员
- 如何调试读写器锁的死锁?
- 为什么在Visual Studio 2013上的std::this_thread::sleep_for上死锁
- localtime() 函数正在调用 ___lll_lock_wait_private(),这会使线程陷入死锁
- 如何重现 Boost 进程文档提示的死锁?
- 多线程Windows GUI应用程序中的死锁
- 为什么printf会导致与future.get的死锁,而cout则不会?
- C++中具有阻塞队列和障碍的死锁
- 死锁使用 std::mutex 来保护多个线程中的 cout
- 避免并发等待对象中的死锁
- 在VC++中从DLLMAIN内部调用D3D的CREATEDEVICE时,它会创建一个死锁(loaderlock?)。有没有办法克服这个问题?最终目标内
- 当用2个螺纹锁定时,将recursive_mutex死锁
- 程序在 C++11 中使用条件变量进入死锁
- 一个线程提升的死锁
- 单个生产者/多个消费者死锁
- 当被调用方法使用调用方已锁定的同一锁时,如何避免死锁
- 如何实现无保留和等待以防止死锁