C#では、たとえばリストがあれば、
lock (this.mylist)
{
...
}
そのコードを使えば、ロックを解除する前に他の誰もリストを使用できないと確信しています。これは、マルチスレッドアプリケーションで役立ちます。Qtで同じことをするにはどうすればよいですか?QMutexとQReadWriteLockに関するドキュメントを読みましたが、特定のオブジェクトでそれらを使用する方法がわかりません。
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
このようなことを行う一般的な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がこのイディオムを非常にうまくサポートしていることがわかります。
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の実装は、ブーストスレッドの実装によく似ています。