我有一个类实例,其他线程中的几个其他类使用它来进行通信。
这个类使用一个苗条的读/写锁(WinAPI's SRWLOCK
)作为同步对象和几个 RAII 帮助类来实际锁定/解锁事物:
static unsigned int readCounter = 0;
class CReadLock
{
public:
CReadLock(SRWLOCK& Lock) : m_Lock(Lock) { InterlockedIncrement(&readCounter); AcquireSRWLockShared(&m_Lock); }
~CReadLock() {ReleaseSRWLockShared(m_Lock); InterlockedDecrement(&readCounter);}
private:
SRWLOCK& m_Lock;
};
class CWriteLock
{
public:
CWriteLock(SRWLOCK& Lock) : m_Lock(Lock) { AcquireSRWLockExclusive(&m_Lock); }
~CWriteLock() { ReleaseSRWLockExclusive(&m_Lock); }
private:
SRWLOCK& m_Lock;
};
问题是整个事情一直陷入僵局。当我暂停死锁的程序时,我看到:
- 一根线卡住了
AcquireSRWLockExclusive()
; - 两个线程卡住了
AcquireSRWLockShared()
; readCounter
全局设置为 3。
在我看来,发生这种情况的唯一方法是CReadLock
实例的析构函数没有被以某种方式调用,所以锁永远卡住了。但是,发生这种情况的唯一方法(据我所知)是因为抛出了异常。不是。我检查了。
可能是什么问题?我应该如何解决(或至少找出原因)这件事?