QReadWriteLock recursion

QReadWriteLock recursion

本文关键字:recursion QReadWriteLock      更新时间:2023-10-16

我在递归模式下使用QReadWriteLock。

这个代码本身没有意义,但我在这里遇到的问题是:

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

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

我认为Write是一个"高级"锁,它允许我读取和写入受保护的数据,而read锁只允许读取。

此外,我认为如果唯一的读取器是请求写锁的同一个读取器,那么写锁就不应该被阻止。

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

我的问题是,这种递归应该被允许吗?这种实施是否会产生任何问题?这些问题会是什么?

来自QReadWriteLock文档:

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

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

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

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

因此,您希望将您的锁从共享(读取)升级为独占(写入)。进行

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

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

lock->changeModus(WRITE);

或者类似的事情,您将创建一个死锁。要获得写锁定,锁定将被阻止,直到释放所有当前的读锁定。因此,在这里,多个线程将阻塞等待。