このページでは

QRecursiveMutex Class

QRecursiveMutex クラスは、スレッド間のアクセスシリアライゼーションを実現します。詳細...

ヘッダー: #include <QRecursiveMutex>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

注:このクラスのすべての関数はスレッドセーフです。

パブリック関数

QRecursiveMutex()
~QRecursiveMutex()
void lock()
(since 6.6) bool tryLock(QDeadlineTimer timeout = {})
bool tryLock(int timeout)
bool try_lock()
bool try_lock_for(std::chrono::duration<Rep, Period> duration)
bool try_lock_until(std::chrono::time_point<Clock, Duration> timePoint)
void unlock()

詳細な説明

QRecursiveMutex クラスは、QMutex と同様のミューテックスであり、API 互換性があります。QMutex との違いは、同じスレッドからのlock() 呼び出しを何度でも受け入れる点にあります。QMutex では、この状況でデッドロックが発生します。

QRecursiveMutexは、構築および操作にかかるコストがはるかに高いため、可能な限り通常のQMutex を使用してください。ただし、あるパブリック関数が別のパブリック関数を呼び出し、その両方が同じミューテックスをロックする必要がある場合があります。この場合、2つの選択肢があります:

  • ミューテックスによる保護が必要なコードをプライベート関数に分離し、それらの関数が呼び出された際にはミューテックスが保持されていることを前提とします。そして、パブリック関数内でプライベート実装を呼び出す前に、通常のQMutex をロックします。
  • あるいは、再帰的ミューテックスを使用します。これにより、2番目のパブリック関数がミューテックスをロックしようとした際に、1番目のパブリック関数がすでにミューテックスをロックしていても問題になりません。

関連項目: QMutex 、QMutexLocker 、QReadWriteLock 、QSemaphore 、およびQWaitCondition 。

メンバ関数のドキュメント

[constexpr noexcept default] QRecursiveMutex::QRecursiveMutex()

新しい再帰的ミューテックスを構築します。このミューテックスはロックされていない状態で作成されます。

lock() およびunlock()も参照してください 。

[noexcept] QRecursiveMutex::~QRecursiveMutex()

ミューテックスを破棄します。

警告: ロックされているミューテックスを破棄すると 、未定義の挙動が生じる可能性があります。

[noexcept(...)] void QRecursiveMutex::lock()

ミューテックスをロックします。別のスレッドがミューテックスをロックしている場合、この呼び出しは、そのスレッドがロックを解除するまでブロックされます。

同じスレッドから同じミューテックスに対してこの関数を複数回呼び出すことは許可されています。

注: LockIsNoexcept がtrue の場合、この関数はnoexceptとなります 。

unlock()も参照してください 。

[noexcept(...), since 6.6] bool QRecursiveMutex::tryLock(QDeadlineTimer timeout = {})

ミューテックスをロックしようと試みます。この関数は、ロックに成功した場合はtrue を返し、失敗した場合はfalse を返します。別のスレッドがミューテックスをロックしている場合、この関数はtimeout が期限切れになり、ミューテックスが利用可能になるまで待機します。

ロックが取得された場合、別のスレッドが正常にロックを行うには、unlock() を使用してミューテックスをアンロックする必要があります。

同じスレッドから同じミューテックスに対してこの関数を複数回呼び出すことは許可されています。

この関数は Qt 6.6 で導入されました。

注: LockIsNoexcept がtrue の場合、この関数は noexcept です。

lock() およびunlock()も参照してください 。

[noexcept(...)] bool QRecursiveMutex::tryLock(int timeout)

ミューテックスをロックしようと試みます。この関数は、ロックに成功した場合はtrue を返し、失敗した場合はfalse を返します。別のスレッドがミューテックスをロックしている場合、この関数はミューテックスが利用可能になるまで、最大timeout ミリ秒待機します。

注:timeout として負の数を渡すことは、lock() を呼び出すことと同じです。つまり、timeout が負の場合、この関数はミューテックスがロック可能になるまで無限に待機します。

ロックが取得された場合、別のスレッドが正常にロックを行うには、unlock() を使用してミューテックスをアンロックする必要があります。

同じスレッドから同じミューテックスに対してこの関数を複数回呼び出すことは許可されています。

注: LockIsNoexcept がtrue の場合、この関数は noexcept です。

lock() およびunlock()も参照してください 。

[noexcept(...)] bool QRecursiveMutex::try_lock()

ミューテックスをロックしようと試みます。この関数は、ロックが取得できた場合は `true ` を返し、そうでない場合は `false` を返します。

この関数は、標準ライブラリの概念である `Lockable` との互換性を確保するために提供されています。これは `tryLock()` と同等です。

注: LockIsNoexcept がtrue の場合、この関数は noexcept です。

template <typename Rep, typename Period> bool QRecursiveMutex::try_lock_for(std::chrono::duration<Rep, Period> duration)

ミューテックスをロックしようと試みます。この関数は、ロックに成功した場合はtrue を返し、失敗した場合はfalse を返します。別のスレッドがミューテックスをロックしている場合、この関数はミューテックスが利用可能になるまで、少なくともduration の間待機します。

注:duration として負の時間を指定することは、try_lock() を呼び出すことと同じです。この動作はtryLock() とは異なります。

ロックが取得された場合、別のスレッドが正常にロックを行うには、unlock() を使用してそのミューテックスをアンロックする必要があります。

同じスレッドから同じミューテックスに対してこの関数を複数回呼び出すことは許可されています。

lock() およびunlock()も参照してください 。

template <typename Clock, typename Duration> bool QRecursiveMutex::try_lock_until(std::chrono::time_point<Clock, Duration> timePoint)

ミューテックスをロックしようと試みます。この関数は、ロックに成功した場合はtrue を返し、失敗した場合はfalse を返します。別のスレッドがミューテックスをロックしている場合、この関数はtimePoint が解決されるまで、少なくともミューテックスが利用可能になるのを待ちます。

注:すでに期限が切れたtimePoint を渡すことは、try_lock()を呼び出すことと同じです。この動作はtryLock()とは異なります。

ロックが取得された場合、別のスレッドが正常にロックを行うには、unlock() を使用してミューテックスをアンロックする必要があります。

同じスレッドから同じミューテックスに対してこの関数を複数回呼び出すことは許可されています。

lock() およびunlock()も参照してください 。

[noexcept] void QRecursiveMutex::unlock()

ミューテックスをアンロックします。ロックを行ったスレッドとは異なるスレッドでミューテックスのアンロックを試みると、エラーが発生します。ロックされていないミューテックスをアンロックすると、未定義の挙動となります。

lock()も参照してください 。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.