c++ - QReadWriteLock递归

标签 c++ qt mutex qthread readwritelock

我在递归模式下使用 QReadWriteLock。

这段代码本身没有意义,但我遇到的问题是从这里产生的:

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

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

我的看法是 Write 是一个“高级”锁,它允许我读取和写入 protected 数据,而 Read 锁只允许读取。

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

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

我的问题是,应该允许这种递归吗?这种实现方式会产生什么问题吗?

最佳答案

来自 QReadWriteLock docs :

Note that the lock type cannot be changed when trying to lock recursively, i.e. it is not possible to lock for reading in a thread that already has locked for writing (and vice versa).

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

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

关于c++ - QReadWriteLock递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12382271/

相关文章:

c++ - 如何将 std::map 与 boost::phoenix 一起使用?

c - 尝试理解 pthread_cond_signal()

C++多线程互斥锁 "reset"

c++ - 在 C++98 和 C++11 中访问枚举值

c++ - 完全作为库实现的 C++ is_lambda 特性是不可能的吗?

c++ - static const 和 constexpr 变量有什么区别?

c++ - Qt QGraphicsScene复制

c++ - windows下Qt5 QSlider调色板无效果

C 控制台应用程序和 Qt gui 之间的通信

c++ - 为什么不能将互斥量传递给线程?