QMutexLocker Class
template <typename Mutex> class QMutexLockerQMutexLocker クラスは、ミューテックスのロックとアンロックを簡略化する便利なクラスです。詳細...
Header: | #include <QMutexLocker> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
- 継承メンバを含む全メンバのリスト
- QMutexLocker はスレッドクラスに属しています。
注意:このクラスの関数はすべてスレッドセーフです。
パブリック関数
QMutexLocker(Mutex *mutex) | |
(since 6.4) | QMutexLocker(QMutexLocker<Mutex> &&other) |
~QMutexLocker() | |
(since 6.4) bool | isLocked() const |
Mutex * | mutex() const |
void | relock() |
(since 6.4) void | swap(QMutexLocker<Mutex> &other) |
void | unlock() |
(since 6.4) QMutexLocker<Mutex> & | operator=(QMutexLocker<Mutex> &&other) |
詳細説明
複雑な関数やステートメント、あるいは例外処理コードの中でQMutex やQRecursiveMutex をロックしたりアンロックしたりすることは、エラーが発生しやすくデバッグが困難です。QMutexLocker は、このような状況で使用することで、ミューテックスの状態が常に適切に定義されるようにします。
QMutexLocker は、QMutex をロックする必要がある関数内で作成する必要があります。QMutexLocker が作成されると、ミューテックスがロックされます。unlock()
relock()
ロックされている場合、QMutexLocker が破棄されると、ミューテックスのロックは解除されます。
例えば、この複雑な関数は、関数に入るときにQMutex をロックし、すべての 終了点でミューテックスのロックを解除します:
int complexFunction(int flag) { mutex.lock(); int retVal = 0; switch (flag) { case 0: case 1: retVal = moreComplexFunction(flag); break; case 2: { int status = anotherFunction(); if (status < 0) { mutex.unlock(); return -2; } retVal = status + flag; } break; default: if (flag > 10) { mutex.unlock(); return -1; } break; } mutex.unlock(); return retVal; }
このサンプル関数は、開発するにつれて複雑になり、エラーが発生する可能性が高くなります。
QMutexLockerを使用することで、コードが大幅に簡素化され、読みやすくなります:
int complexFunction(int flag) { QMutexLocker locker(&mutex); int retVal = 0; switch (flag) { case 0: case 1: return moreComplexFunction(flag); case 2: { int status = anotherFunction(); if (status < 0) return -2; retVal = status + flag; } break; default: if (flag > 10) return -1; break; } return retVal; }
QMutexLockerオブジェクトが破棄されたとき(locker
は自動変数なので、関数が戻ったとき)、ミューテックスは常にアンロックされます。
同じ原則が、例外をスローしたりキャッチしたりするコードにも適用されます。ミューテックスをロックした関数でキャッチされなかった例外は、例外がスタックから呼び出し関数に渡される前に、ミューテックスのロックを解除する方法がありません。
QMutexLockerは、QMutexLockerが操作しているミューテックスを返すmutex()
メンバ関数も提供しています。これは、QWaitCondition::wait() のような、ミューテックスへのアクセスが必要なコードに便利です。例えば
class SignalWaiter { private: QMutexLocker<QMutex> locker; public: SignalWaiter(QMutex *mutex) : locker(mutex) { } void waitForSignal() { ... while (!signalled) waitCondition.wait(locker.mutex()); ... } };
QReadLocker 、QWriteLocker 、QMutexも参照して ください。
メンバ関数 ドキュメント
[explicit noexcept]
QMutexLocker::QMutexLocker(Mutex *mutex)
QMutexLocker を構築し、mutex をロックします。QMutexLocker が破棄されると、ミューテックスはアンロックされます。mutex がnullptr
の場合、QMutexLocker は何もしません。
QMutex::lock()も参照してください 。
[noexcept, since 6.4]
QMutexLocker::QMutexLocker(QMutexLocker<Mutex> &&other)
移動-other から QMutexLocker を構築します。ミューテックスとother の状態は、新しく構築されたインスタンスに転送されます。移動後、other はミューテックスを管理しなくなります。
この関数は Qt 6.4 で導入されました。
QMutex::lock()も参照してください 。
QMutexLocker::~QMutexLocker()
QMutexLocker を破棄し、コンストラクタでロックされていたミューテックスのロックを解除します。
QMutex::unlock()も参照して ください。
[noexcept, since 6.4]
bool QMutexLocker::isLocked() const
このQMutexLocker が関連付けられたミューテックスを現在ロックしている場合は true を返し、そうでない場合は false を返します。
この関数は Qt 6.4 で導入されました。
Mutex *QMutexLocker::mutex() const
QMutexLocker が操作しているミューテックスを返します。
[noexcept]
void QMutexLocker::relock()
ロックされていないミューテックス・ロッカーを再ロックします。
unlock()も参照してください 。
[noexcept, since 6.4]
void QMutexLocker::swap(QMutexLocker<Mutex> &other)
このQMutexLocker のミューテックスと状態をother と交換します。この操作は非常に高速で、失敗することはありません。
この関数は Qt 6.4 で導入されました。
QMutex::lock()も参照してください 。
[noexcept]
void QMutexLocker::unlock()
このミューテックス・ロッカーのロックを解除します。relock()
を使って再びロックすることができます。破棄するときはロックする必要はありません。
relock()も参照して ください。
[noexcept, since 6.4]
QMutexLocker<Mutex> &QMutexLocker::operator=(QMutexLocker<Mutex> &&other)
Move-assignsother をこのQMutexLocker に割り当てます。割り当て前にQMutexLocker がロックされたミューテックスを保持していた場合、そのミューテッ クスはアンロックされる。その後、ミューテックスとother の状態がこのQMutexLocker に転送される。移動後、other はミューテックスを管理しなくなります。
この関数はQt 6.4で導入されました。
QMutex::lock()も参照してください 。
©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。