QReadWriteLock递归

0xb*_*00d 5 c++ qt mutex readwritelock qthread

我在递归模式下使用QReadWriteLock。

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

lock->lockForWrite();
lock->lockForRead();
Run Code Online (Sandbox Code Playgroud)

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

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

另外,我认为如果唯一的阅读器是同一位要求写锁定的读者,则不应阻止写锁定。

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

我的问题是,应该允许这种递归吗?这种实现会带来什么问题吗?它们将是什么?

Gaz*_*yer 4

来自QReadWriteLock 文档

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

所以,就像你说的,这就是它的工作方式。我个人不明白允许在同一线程上进行读取作为写入锁定项目会如何导致问题,但也许它需要低效的锁定实现?

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