问题标签 [qreadwritelock]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1787 浏览

c++ - 在 Qt 中,如何查询 QMutex 或 QReadWriteLock 的状态?

我在我的应用程序中使用QReadWriteLock来保护对资源对象的访问。

我尽可能使用 QReadLocks 和 QWriteLocks,但有时我需要一个跨越函数边界的“长寿命”锁。所以有时我需要能够查询 QReadWriteLock(或 QMutex,在这种情况下也是如此)的状态,因为解锁已经解锁的互斥锁非常糟糕。

对于 QMutex:

解锁未锁定的互斥锁会导致未定义的行为。

对于 QReadWriteLock:

尝试解锁未锁定的锁是错误的,将导致程序终止。

能够查询互斥锁的状态也非常方便调试断言在开始某些操作之前测试,我确实拥有那个“长寿命”锁。

但我真正想要的只是如果我有锁就能够解锁互斥锁,如果我没有锁就不能解锁它。那会让我很开心。IMO 该unlock()功能应该已经为我执行此操作,但事实并非如此。

有什么办法吗?

(不,Recursive在这种情况下使用模式没有帮助)

0 投票
2 回答
648 浏览

c++ - QReadWriteLock 递归模式不起作用

在使用 gcc 4.4.3 的 Linux qt 4.7.4 下,以下代码编译良好并且没有运行时错误。

锁被同一个线程多次锁定,没有任何反应。根据手册http://doc.qt.io/archives/qt-4.7/qreadwritelock.html

锁应该只能被同一个线程锁定一次。这是一些严重的错误还是我误解了手册?

回复 Chris:锁也必须在 NonRecursive 中多次解锁,如果注释掉一个解锁,则以下代码永远不会打印“Writing”。

0 投票
1 回答
151 浏览

qt - 访问器中的 QReadWriteLock

我有一个 MyClass 的 QList。从列表中添加和删除项目很少见,并且由常见的列表互斥锁控制。MyClass 包含几个子结构和个人 QReadWriteLock:

我把储物柜放在这样的存取器中:

我希望子结构的副本将被安全返回。和我在二传手做的一样。使用这样的储物柜是一种好习惯吗?首先会发生什么:复制基础结构或破坏储物柜?