Spec-Zone.ru › Qt 5.9

Класс QMutexLocker

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

Заголовок: #include <QMutexLocker>
qmake: QT += core
  • Список всех членов, включая унаследованные

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

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

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

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

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

Блокировка и разблокировка QMutex в сложных функциях и операторах или в обработке исключений — задача, склонная к ошибкам и трудно отлаживаемая. 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(QMutex *mutex)

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

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

QMutexLocker::~QMutexLocker()

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

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

QMutex *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-5.9/qmutexlocker.html

Spec-Zone.ru

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