我们什么时候使用QMutexLocker重新锁定和解锁?

时间:2014-10-05 06:41:13

标签: c++ multithreading qt

正如标题所示,你如何使用QMutexLocker重锁和解锁成员函数,我很难弄清楚如何做到这一点。

  1. 使用RAII风格的QMutexLocker是否总能从数据竞争中获得承诺精确锁定状态?

  2. 如果不是,当可能发生这样的情况时,我们需要调用解锁和重新锁定功能吗?

  3. 我在此qt来源https://qt.gitorious.org/qt/qtbase/source/3b577dfe798bf5065a2bba4d7095709454aa709c:src/plugins/platforms/android/androidjnimenu.cpp中看到了QMutexLocker的使用情况 它确实实现了不同的qmutex变量,以便在QMutexLocker中使用。我的问题是我们什么时候需要许多所有权qmutex用于不同的qmutexlocker,如上面的qt源?什么时候我们只需要单一所有权qmutex用于不同的qmutexlocker?

  4. 请举一个例子,请第二个问题..谢谢

1 个答案:

答案 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;
  }
};