Spec-Zone.ru › Qt 6.0

Класс QMutexLocker

шаблон <typename Mutex> class QMutexLocker

Класс QMutexLocker — это вспомогательный класс, который упрощает блокировку и разблокировку мьютексов. Подробнее...

Заголовок: #include <QMutexLocker>
CMake: find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
  • Список всех членов, включая унаследованные

Примечание: Все функции в этом классе являются безопасными для потоков.

Открытые функции

QMutexLocker(Mutex *mutex)
~QMutexLocker()
Mutex * mutex() const
void relock()
void unlock()

Подробное описание

Блокировка и разблокировка 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 также предоставляет функцию-член mutex(), которая возвращает мьютекс, над которым работает QMutexLocker. Это полезно для кода, которому нужен доступ к мьютексу, например, QWaitCondition::wait(). Например:

class SignalWaiter
{
private:
    QMutexLocker locker;

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

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

См. также QReadLocker, QWriteLocker и QMutex.

Документация по функциям-членам

QMutexLocker::QMutexLocker(Mutex *mutex)

Конструктор QMutexLocker и блокирует mutex. Мьютекс будет разблокирован при уничтожении QMutexLocker. Если mutex nullptr, QMutexLocker ничего не делает.

См. также QMutex::lock().

QMutexLocker::~QMutexLocker()

Уничтожает QMutexLocker и разблокирует мьютекс, который был заблокирован в конструкторе.

См. также QMutex::unlock().

Mutex *QMutexLocker::mutex() const

Возвращает мьютекс, над которым работает QMutexLocker.

void QMutexLocker::relock()

Повторно блокирует разблокированный мьютекс.

См. также unlock().

void QMutexLocker::unlock()

Разблокирует этот мьютекс. Вы можете использовать relock() для повторной блокировки. Он не должен быть заблокирован при уничтожении.

См. также relock().

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/qmutexlocker.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API