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

use*_*753 0 c++ qt multithreading

正如标题所暗示的,你如何使用 QMutexLocker 重新锁定和解锁成员功能,我很难弄清楚这怎么做。

  1. 使用 QMutexLocker 的 RAII 风格是否总是从数据竞争中保证良好的锁定状态?

  2. 如果没有,那么当这种情况很可能发生时,我们需要调用unlock和relock函数吗?

  3. 我从这个 qt 源https://qt.gitorious.org/qt/qtbase/source/3b577dfe798bf5065a2bba4d7095709454aa709c:src/plugins/platforms/android/androidjnimenu.cpp 中看到 QMutexLocker 的用法
    它确实使用了不同的 QxLocker.m 我的问题是我们什么时候需要许多所有权 qmutex 用于不同的 qmutexlocker 像上面的 qt 源?我们什么时候只需要单一所有权 qmutex 才能在不同的 qmutexlocker 中使用?

你能举个例子吗第二个问题..谢谢

Rei*_*ica 5

解锁和重新锁定的典型用例是 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;
  }
};
Run Code Online (Sandbox Code Playgroud)