4

C#では、たとえばリストがあれば、

lock (this.mylist)
{
    ...
}

そのコードを使えば、ロックを解除する前に他の誰もリストを使用できないと確信しています。これは、マルチスレッドアプリケーションで役立ちます。Qtで同じことをするにはどうすればよいですか?QMutexとQReadWriteLockに関するドキュメントを読みましたが、特定のオブジェクトでそれらを使用する方法がわかりません。

4

3 に答える 3

2

QMutex相互に依存するすべてのクリティカルセクション(またはC / C ++の標準的な同期方法)を使用するには、ミューテックスについて知っている必要があります。これを確実にするための最も簡単な(ただし、C ++のベストプラクティスではありません。つまり、クラスメンバーなどにする)方法は、グローバル変数ミューテックスを作成することです(たとえば、これを行います)。

したがって、次のことを考慮してください

QMutex mutex;

void someMethod()
{
  mutex.lock();
  // Critical section
  mutex.unlock();
}

現在、lockおよびunlockはアトミックメソッドであるため、常に1つのスレッドのみがクリティカルセクションに入ることができます。重要なのは、両方が同じミューテックスにアクセスしようとしているということです。

C#したがって、本質的に、これは、ミューテックスを自分で管理する必要があることを除いて、同じように機能します。したがって、lock(...) { ... }ブロックはに置き換えられmutex.lock() ... mutex.unlock()ます。ただし、これは、クリティカルセクションアイテム(つまり、例ではthis->mylist)にアクセスする場合は常に、ミューテックスを使用する必要があることも意味します。

EDITQt には非常に優れたドキュメントがあります。QMutexあなたはここでもっと読むことができます:http: //doc.qt.io/qt-4.8/qmutex.html

于 2012-04-25T16:19:22.300 に答える
2

このようなことを行う一般的なC++の方法は、RAIIを使用することであるため、次のようなコードになります。

// Inside a function, a block that needs to be locked
{
  QMutexLocker lock(&mutex); // locks mutex
  // Do stuff

  // "QMutexLocker" destructor unlocks the mutex when it goes out of scope
}

それがQtにどのように変換されるかはわかりませんが、ネイティブサポートがない場合は、おそらくヘルパークラスを作成できます。

編集:Coryのおかげで、Qtがこのイディオムを非常にうまくサポートしていることがわかります。

于 2012-04-25T16:24:28.533 に答える
0

C ++ 11では、これを行うことができます。

#include <thread>
#include <mutex>

std::mutex mut;

void someMethod()
{
  std::lock_guard(mut);
  // Critical section
}

これはRAIIのイディオムです。ロックガードは、someMethodスコープがどのように終了しても(通常のリターンまたはスロー)、ロックを解放するオブジェクトです。AnthonyWilliamsによるC++同時実行の実行を参照してください。彼はまた、C++11スレッドの実装を持っています。C ++ 11の実装は、ブーストスレッドの実装によく似ています。

于 2012-04-25T16:45:54.693 に答える