6

我在递归模式下使用 QReadWriteLock。

这段代码本身没有意义,但我从这里出现的问题:

lock->lockForWrite();
lock->lockForRead();

lockForRead 被阻止。请注意,这是在递归模式下。

我看到它的方式是 Write 是一个“高级”锁,它允许我读取和写入受保护的数据,而 Read lock 只允许读取。

另外,我认为如果唯一的读者是同一个请求写锁的读者,则不应阻止写锁。

我可以从 qreadwritelock.cpp 源代码中看到,没有尝试让它像我想要的那样工作。所以这不是错误,而是我发现缺少的功能。

我的问题是,应该允许这种递归吗?这种实施是否会出现任何问题?它们会是什么?

4

2 回答 2

4

来自QReadWriteLock 文档

请注意,尝试递归锁定时无法更改锁定类型,即无法在已经锁定写入的线程中锁定读取(反之亦然)。

所以,就像你说的,这就是它的工作方式。我个人看不出允许在与写锁定项相同的线程上读取如何导致问题,但也许它需要低效的锁定实现?

您可以尝试在 QT 论坛上提问,但我怀疑您会得到明确的答案。如果你需要的话,你为什么不把 QT 源代码作为开始,然后自己去实现它。编写同步对象可能很棘手,但这是一个很好的学习练习。

于 2012-09-12T07:49:41.920 回答
1

我在自己搜索相同的功能时发现了这个问题。在考虑自己实现这一点时,我意识到这样做肯定会出现问题

所以你想把你的锁从共享(读)升级到独占(写)。正在做

lock->unlock();
lock->lockForWrite();

不是您想要的,因为您不希望其他线程在当前线程释放读锁后立即获得写锁。但如果有一个

lock->changeModus(WRITE);

或类似的东西,你会造成死锁。为了获得写锁,锁会阻塞,直到所有当前的读锁都被释放。所以在这里,多个线程会互相阻塞等待。

于 2013-10-23T09:19:08.697 回答