正如标题所示,你如何使用QMutexLocker重锁和解锁成员函数,我很难弄清楚如何做到这一点。
使用RAII风格的QMutexLocker是否总能从数据竞争中获得承诺精确锁定状态?
如果不是,当可能发生这样的情况时,我们需要调用解锁和重新锁定功能吗?
我在此qt来源https://qt.gitorious.org/qt/qtbase/source/3b577dfe798bf5065a2bba4d7095709454aa709c:src/plugins/platforms/android/androidjnimenu.cpp中看到了QMutexLocker的使用情况 它确实实现了不同的qmutex变量,以便在QMutexLocker中使用。我的问题是我们什么时候需要许多所有权qmutex用于不同的qmutexlocker,如上面的qt源?什么时候我们只需要单一所有权qmutex用于不同的qmutexlocker?
请举一个例子,请第二个问题..谢谢
答案 0 :(得分:3)
解锁和重新锁定的典型用例是get-modify-update:
class Foo {
QMutex dataMutex;
QVector<int> data;
public:
/// Thread-safe
void modify() {
QMutexLocker lock(&dataMutex);
QVector<int> copy = data;
lock.unlock();
copy << 42;
lock.relock();
data = copy;
}
};