我有一个类实例,被其他线程中的几个类用于通信。
这个类使用一个轻量级读写锁(WinAPI的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
实例的析构函数某些地方没有被调用,因此锁被永久卡住了。然而,这种情况发生的唯一可能原因(就我所知)是由于已经抛出了异常。但事实上并没有抛出异常。我进行了检查。可能的问题是什么?我应该如何修复(或至少定位原因)?
bar
应该只获取锁,对吗?而且如果foo
调用baz
可能会发生死锁(不知道锁是否可递归)。 - Lol4t0AcquireSRWLockShared
дёҺPOSIXзҡ„pthread_rwlock_rdlock
жҲ–EnterCriticalSection
дёҚеҗҢпјҢе®ғдёҚжҳҜйҖ’еҪ’зҡ„гҖӮ - Artyom