我有一个类实例被其他线程中的其他几个类用于通信。什么可能导致单个写/多读锁的死锁?
该类采用了超薄读/写器锁(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
实例的析构函数没有被调用莫名其妙的地方,因此锁是永久地。然而,发生这种情况的唯一方式(据我所知)是因为抛出了异常。事实并非如此。我检查了。
可能是什么问题?我应该如何解决这个问题(或者至少找出原因)?
不应该'酒吧'只是得到锁?如果'foo'调用'baz'(不知道锁是否是递归的),它也许可能会死锁 – Lol4t0
不需要,Win32 API的'AcquireSRWLockShared' **不是递归**,不像POSIX的'pthread_rwlock_rdlock'或'EnterCriticalSection' – Artyom
你能证明'baz要求创建写锁吗?现在所有的读锁都会被阻塞,直到所有的锁都被释放 - 等待。'?因为MSDN [说](http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937%28v=vs.85%29.aspx):'不能保证线程的顺序该请求的所有权将被授予所有权; SRW锁定既不公平也不先进。' – Lol4t0