Spec-Zone.ru › Qt 6.1

Класс 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.1/qrecursivemutex.html

Spec-Zone.ru

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