他のスレッドの他のいくつかのクラスが通信するために使用するクラス インスタンスがあります。
このクラスは、スリム リーダー/ライター ロック (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;
};
問題は、すべてが常にデッドロックになっていることです。デッドロックしたプログラムを一時停止すると、次のように表示されます。
- スレッドが 1 つ詰まってい
AcquireSRWLockExclusive()
ます。 - 2 つのスレッドが詰まってい
AcquireSRWLockShared()
ます。 readCounter
グローバルは 3 に設定されています。
私の見方では、これが発生する唯一の方法は、CReadLock
インスタンスのデストラクタがどこかで呼び出されていないため、ロックが永続的にスタックしていることです。ただし、これが発生する唯一の方法は (私の知る限り)、例外がスローされたためです。そうではありませんでした。私がチェックしました。
何が問題なのですか?このことを修正する(または少なくともその理由を突き止める)にはどうすればよいですか?