Sur cette page

QMutexLocker Class

template <typename Mutex> class QMutexLocker

La classe QMutexLocker est une classe de commodité qui simplifie le verrouillage et le déverrouillage des mutex. Plus d'informations...

En-tête : #include <QMutexLocker>
CMake : find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake : QT += core

Remarque : toutes les fonctions de cette classe sont sûres pour les threads.

Fonctions publiques

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)

Description détaillée

Le verrouillage et le déverrouillage d'un QMutex ou d'un QRecursiveMutex dans des fonctions et des instructions complexes ou dans un code de gestion des exceptions est source d'erreurs et difficile à déboguer. QMutexLocker peut être utilisé dans de telles situations pour garantir que l'état du mutex est toujours bien défini.

QMutexLocker doit être créé dans une fonction où un QMutex doit être verrouillé. Le mutex est verrouillé lorsque QMutexLocker est créé. Vous pouvez déverrouiller et reverrouiller le mutex avec unlock() et relock(). S'il est verrouillé, le mutex sera déverrouillé lorsque le QMutexLocker sera détruit.

Par exemple, cette fonction complexe verrouille un QMutex à l'entrée de la fonction et déverrouille le mutex à tous les points de sortie :

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;
}

Cet exemple de fonction deviendra de plus en plus complexe au fur et à mesure de son développement, ce qui augmentera la probabilité d'erreurs.

L'utilisation de QMutexLocker simplifie grandement le code et le rend plus lisible :

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;
}

Désormais, le mutex sera toujours déverrouillé lorsque l'objet QMutexLocker sera détruit (au retour de la fonction, puisque locker est une variable automatique).

Le même principe s'applique au code qui lance et attrape des exceptions. Une exception qui n'est pas capturée dans la fonction qui a verrouillé le mutex n'a aucun moyen de déverrouiller le mutex avant que l'exception ne soit transmise à la fonction appelante.

QMutexLocker fournit également une fonction membre mutex() qui renvoie le mutex sur lequel QMutexLocker opère. Cette fonction est utile pour le code qui a besoin d'accéder au mutex, comme QWaitCondition::wait(). Par exemple :

class SignalWaiter
{
private:
    QMutexLocker<QMutex> locker;

public:
    SignalWaiter(QMutex *mutex)
        : locker(mutex)
    {
    }

    void waitForSignal()
    {
        //...
        while (!signalled)
            waitCondition.wait(locker.mutex());
        //...
    }
};

Voir aussi QReadLocker, QWriteLocker, et QMutex.

Documentation des fonctions membres

[explicit noexcept(...)] QMutexLocker::QMutexLocker(Mutex *mutex)

Construit un QMutexLocker et verrouille mutex. Le mutex sera déverrouillé lorsque le QMutexLocker sera détruit. Si mutex est nullptr, QMutexLocker ne fait rien.

Remarque : cette fonction est noexcept lorsque LockIsNoexcept est true.

Voir également QMutex::lock().

[noexcept, since 6.4] QMutexLocker::QMutexLocker(QMutexLocker<Mutex> &&other)

Move-construit un QMutexLocker à partir de other. Le mutex et l'état de other sont transférés à la nouvelle instance construite. Après le déplacement, other ne gérera plus aucun mutex.

Cette fonction a été introduite dans Qt 6.4.

Voir aussi QMutex::lock().

QMutexLocker::~QMutexLocker()

Détruit le site QMutexLocker et déverrouille le mutex verrouillé dans le constructeur.

Voir aussi QMutex::unlock().

[noexcept, since 6.4] bool QMutexLocker::isLocked() const

Retourne true si ce QMutexLocker est en train de verrouiller son mutex associé, ou false dans le cas contraire.

Cette fonction a été introduite dans Qt 6.4.

Mutex *QMutexLocker::mutex() const

Renvoie le mutex sur lequel QMutexLocker opère.

[noexcept(...)] void QMutexLocker::relock()

Reverrouille un casier de mutex déverrouillé.

Note : Cette fonction est noexcept lorsque LockIsNoexcept est true.

Voir aussi unlock().

[noexcept, since 6.4] void QMutexLocker::swap(QMutexLocker<Mutex> &other)

Échange le mutex et l'état de ce site QMutexLocker avec other. Cette opération est très rapide et n'échoue jamais.

Cette fonction a été introduite dans Qt 6.4.

Voir aussi QMutex::lock().

[noexcept] void QMutexLocker::unlock()

Déverrouille ce casier mutex. Vous pouvez utiliser relock() pour le verrouiller à nouveau. Il n'a pas besoin d'être verrouillé lorsqu'il est détruit.

Voir aussi relock().

[noexcept, since 6.4] QMutexLocker<Mutex> &QMutexLocker::operator=(QMutexLocker<Mutex> &&other)

Move-assigns other on this QMutexLocker. Si ce QMutexLocker détenait un mutex verrouillé avant l'assignation, le mutex sera déverrouillé. Le mutex et l'état de other sont alors transférés à QMutexLocker. Après le transfert, other ne gérera plus aucun mutex.

Cette fonction a été introduite dans Qt 6.4.

Voir aussi QMutex::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.