Spec-Zone.ru › Qt 6.0

Класс 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()

Создаёт новый рекурсивный мьютекс. Мьютекс создаётся в разблокированном состоянии.

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

QRecursiveMutex::~QRecursiveMutex()

Удаляет мьютекс.

Предупреждение: Удаление заблокированного мьютекса может привести к неопределённому поведению.

void QRecursiveMutex::lock()

Захватывает мьютекс. Если другой поток заблокировал мьютекс, этот вызов заблокируется до тех пор, пока этот поток не разблокирует его.

Вызов этой функции несколько раз на том же мьютексе из одного и того же потока разрешён.

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

bool QRecursiveMutex::tryLock(int timeout = 0)

Пытается захватить мьютекс. Эта функция возвращает true если блокировка была получена; в противном случае возвращает false. Если другой поток заблокировал мьютекс, эта функция будет ждать не более timeout миллисекунд, пока мьютекс не станет доступным.

Примечание: Передача отрицательного числа в качестве timeout эквивалентна вызову lock(), то есть эта функция будет ждать вечно, пока мьютекс не будет захвачен, если timeout отрицателен.

Если блокировка была получена, мьютекс необходимо разблокировать с помощью unlock() перед тем, как другой поток сможет успешно заблокировать его.

Вызов этой функции несколько раз на том же мьютексе из одного и того же потока разрешён.

См. также lock() и 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.

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

[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.

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

void QRecursiveMutex::unlock()

Разблокирует мьютекс. Попытка разблокировать мьютекс в другом потоке, чем тот, который его заблокировал, приводит к ошибке. Разблокировка мьютекса, который не заблокирован, приводит к неопределённому поведению.

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

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

Spec-Zone.ru

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