Класс QRecursiveMutex
Класс QRecursiveMutex обеспечивает сериализацию доступа между потоками. Подробнее...
| Заголовок: | #include <QRecursiveMutex> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| С тех пор: | Qt 5.14 |
Примечание: Все функции в этом классе являются безопасными для потоков.
Публичные функции
| QRecursiveMutex() | |
| ~QRecursiveMutex() | |
| void | lock() |
| bool | tryLock(int timeout = 0) |
| 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 всякий раз, когда это возможно. Иногда, однако, одна публичная функция вызывает другую публичную функцию, и обеим нужна блокировка одного и того же мьютекса. В этом случае у вас есть два варианта:
- Разделите код, требующий защиты мьютексом, на частные функции, которые предполагают, что мьютекс захвачен при их вызове, и заблокируйте обычный QMutex в публичных функциях перед вызовом частных реализаций.
- Или используйте рекурсивный мьютекс, так как неважно, что первая публичная функция уже заблокировала мьютекс, когда вторая хочет это сделать.
См. также QMutex, QMutexLocker, QReadWriteLock, QSemaphore и QWaitCondition.
Документация функций-членов
QRecursiveMutex::QRecursiveMutex()
Создает новый рекурсивный мьютекс. Мьютекс создается в разблокированном состоянии.
QRecursiveMutex::~QRecursiveMutex()
Удаляет мьютекс.
Предупреждение: Удаление заблокированного мьютекса может привести к неопределенному поведению.
void QRecursiveMutex::lock()
Захватывает мьютекс. Если другой поток заблокировал мьютекс, этот вызов будет блокироваться, пока этот поток не разблокирует его.
Вызов этой функции несколько раз на одном мьютексе из одного и того же потока разрешен.
См. также unlock().
bool QRecursiveMutex::tryLock(int timeout = 0)
Попытка захватить мьютекс. Эта функция возвращает true , если блокировка была получена; в противном случае она возвращает false. Если другой поток заблокировал мьютекс, эта функция будет ждать не более timeout миллисекунд, пока мьютекс не станет доступным.
Примечание: Передача отрицательного числа в качестве timeout эквивалентна вызову lock(), т.е. эта функция будет ждать вечно, пока мьютекс не будет захвачен, если timeout отрицательный.
Если блокировка была получена, мьютекс должен быть разблокирован с помощью unlock() прежде, чем другой поток сможет успешно захватить его.
Вызов этой функции несколько раз на одном мьютексе из одного и того же потока разрешен.
[since 5.8] bool QRecursiveMutex::try_lock()
Попытка захватить мьютекс. Эта функция возвращает true , если блокировка была получена; в противном случае она возвращает false.
Эта функция предоставляется для совместимости с концепцией Стандартной библиотеки Lockable. Она эквивалентна tryLock().
Эта функция была введена в Qt 5.8.
[since 5.8] template <typename Rep, typename Period> bool QRecursiveMutex::try_lock_for(std::chrono::duration<Rep, Period> duration)
Попытка захватить мьютекс. Эта функция возвращает true , если блокировка была получена; в противном случае она возвращает false. Если другой поток заблокировал мьютекс, эта функция будет ждать не менее duration, пока мьютекс не станет доступным.
Примечание: Передача отрицательной длительности в качестве duration эквивалентна вызову try_lock(). Это поведение отличается от tryLock().
Если блокировка была получена, мьютекс должен быть разблокирован с помощью unlock() прежде, чем другой поток сможет успешно захватить его.
Вызов этой функции несколько раз на одном мьютексе из одного и того же потока разрешен.
Эта функция была введена в Qt 5.8.
[since 5.8] 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() прежде, чем другой поток сможет успешно захватить его.
Вызов этой функции несколько раз на одном мьютексе из одного и того же потока разрешен.
Эта функция была введена в Qt 5.8.
void QRecursiveMutex::unlock()
Разблокирует мьютекс. Попытка разблокировать мьютекс в другом потоке, чем тот, который его заблокировал, приводит к ошибке. Разблокирование мьютекса, который не заблокирован, приводит к неопределённому поведению.
См. также lock().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qrecursivemutex.html