我在递归模式下使用QReadWriteLock。
这段代码本身并没有意义,但我从这里得到的问题是:
lock->lockForWrite();
lock->lockForRead();
lockForRead被阻止。请注意,这是递归模式。
我看到的方式是Write是一个“优越”的锁,它允许我读取和写入受保护的数据,其中Read lock只允许读取。
此外,我认为如果唯一的读卡器是同一个要求写锁定的读卡器,则不应阻止写锁定。
我可以从qreadwritelock.cpp源代码中看到,没有尝试让它像我想要的那样工作。所以这不是一个错误,而是一个我发现缺失的功能。
我的问题是,如果允许这种递归吗?这种实施是否会产生任何问题?它们会是什么?
答案 0 :(得分:4)
请注意,尝试锁定时无法更改锁定类型 递归地,即不可能锁定在线程中读取 已经锁定写作(反之亦然)。
所以,就像你说的那样,它就是它的工作方式。我个人无法看到允许在与写锁定项相同的线程上读取会导致问题,但是它可能需要低效的锁实现?
您可以尝试在QT论坛上询问,但我怀疑您会得到明确的答案。 你为什么不把QT资源作为入门者,如果你需要的话,可以自己实施。编写同步对象可能很棘手,但这是一个很好的学习练习。
答案 1 :(得分:1)
我在自己搜索相同的功能时发现了这个问题。 在考虑自己实现这一点时,我意识到确实存在问题正在这样做:
因此,您希望将锁从共享(读取)升级到独占(写入)。做
lock->unlock();
lock->lockForWrite();
不是你想要的,因为你想在当前线程释放读锁之后没有其他线程立即获得写锁。但如果有一个
lock->changeModus(WRITE);
或类似的东西,你将创建一个死锁。要获得写锁定,锁定将阻塞,直到释放所有当前读锁定。所以在这里,多个线程将阻止彼此等待。