什么可能导致单个写入/多读锁的僵局
What could cause a deadlock of a single write/multiple read lock?
我有一个类实例,其他几个类别中的其他几个线程中使用的类实例进行交流。
此类使用纤细的读取器/作者锁(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
实例的驱动器尚未以某种方式称为某个地方,因此锁一直被卡住。但是,(据我所知)唯一发生这种情况的方法是因为抛出了例外。不是。我检查了。
可能是什么问题?我应该如何修复此东西(或至少找到原因)?
您是否以递归方式读取锁?
void foo()
{
CReadLock rl(m_lock);
...
bar();
}
void bar()
{
CReadLock rl(m_lock);
...
}
void baz()
{
CWritedLock rl(m_lock);
...
}
如果foo()
和baz()
同时称为僵局:
1. (Thread A) foo locks
2. (Thread B) baz asks to create write lock now all read locks would block until all are released - waits.
3. (Thread A) bar tries to lock and waits because there is pending write lock
您有2个线程粘在读取锁上和读取锁定计数器上的事实是3,很可能表明您在其中一个锁中有递归 - 即,一个线程试图获得两次读取锁。
。one thread stuck in AcquireSRWLockExclusive();
two threads stuck in AcquireSRWLockShared();
readCounter global is set to 3.
好吧,据我从中读取,您有一个线程持有读取锁,一个写线程等待该读锁的释放,还有两个读取线程等待该写入线程以获取和释放锁。
换句话说,您有一个悬挂的读取线程,它没有像您说的那样破坏蜜蜂。将调试打印添加到破坏者和构造函数。
相关文章:
- 如何调试读写器锁的死锁?
- 如何使用单个解锁方法(可称为读取器或写入器)实现C++读写器锁?
- 简单的读写锁
- 两个提升的无锁队列会导致僵局
- 带有静音的多个锁和僵局的可能性
- 快速且无锁的单写器、多读器
- CreateProcess cmd.exe读/写管道死锁
- C 螺纹僵局静止误锁中止
- 即使使用MUTEX锁,C STD上的僵局也是如此
- 什么可能导致单个写入/多读锁的僵局
- 优化读/写锁的实现
- 单读多写器,带pthreads和锁,不带boost
- 无锁单写多读列表的实现细节
- 如何从更基本的同步原语中创建多读/单写锁
- 此用例是否需要读写锁
- 仅使用关键部分的读/写锁定会导致死锁
- 在线程内部函数上使用哪种保护方法(互斥,读写锁.)
- 我们可以在socket Map上使用读写锁吗?
- tmultireadexexclusivewritesynchronizer将写锁降级为读锁时的行为
- 写文件/读文件死锁