Класс 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<QMutex> 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.2/qmutexlocker.html