Постусловия
Если функция вернула true, то this->owns_lock() == true, иначе this->owns_lock() == false.
STD::UNIQUE_LOCK::OPERATOR BOOL , ФУНКЦИЯ-ЧЛЕН
Проверяет, владеет ли *thisблокировкой мьютекса.
Объявление
explicit operator bool() const noexcept;
Возвращаемое значение this->owns_lock(). Исключения
Нет.
Примечание. Это оператор явного преобразования, поэтому он вызывается неявно только в контекстах, где результат используется как булевское значение, а не тогда, когда результат трактуется как целое, равное 0 или 1.
STD::UNIQUE_LOCK::OWNS_LOCK , ФУНКЦИЯ-ЧЛЕН
Проверяет, владеет ли *thisблокировкой мьютекса.
Объявление
bool owns_lock() const noexcept;
Возвращаемое значение
true, если *thisвладеет блокировкой мьютекса, иначе false.
Исключения
Нет.
STD::UNIQUE_LOCK::MUTEX , ФУНКЦИЯ-ЧЛЕН
Возвращает мьютекс, ассоциированный с *this, если таковой имеется.
Объявление
mutex_type* mutex() const noexcept;
Возвращаемое значение
Указатель на мьютекс, ассоциированный с *this, если таковой имеется, иначе NULL.
Исключения
Нет.
STD::UNIQUE_LOCK::RELEASE , ФУНКЦИЯ-ЧЛЕН
Возвращает мьютекс, ассоциированный с *this, если таковой имеется, и разрывает эту ассоциацию.
Объявление
mutex_type* release() noexcept;
Результат
Разрывает ассоциацию мьютекса с *this, не освобождая блокировку.
Возвращаемое значение
Указатель на мьютекс, ассоциированный с *this, если таковой имеется, иначе NULL.
Постусловия
this->mutex() == NULL, this->owns_lock() == false.
Исключения
Нет.
Примечание. Если this->owns_lock()вернула бы до этого обращения true, то с этого момента за освобождение мьютекса отвечает вызывающая программа.
D.5.7. Шаблон функции std::lock
Шаблон функции std::lockпредоставляет возможность захватить сразу несколько мьютексов, не опасаясь возникновения взаимоблокировки из-за несогласованного порядка захвата.
Объявление
template
void lock(LockableType1& m1, LockableType2& m2...);
Предусловия
Типы параметров LockableType1, LockableType2, … должны удовлетворять требованиям концепции Lockable.
Результат
Захватывает все объекты m1, m2, … допускающих блокировку типов, обращаясь к функциям-членам lock(), try_lock()и unlock()этих типов в порядке, который гарантированно не приводит к взаимоблокировкам, но в остальном не специфицирован.
Постусловия
Текущий поток захватывает все переданные в аргументах объекты.
Исключения
Любое исключение, возбуждаемое обращениями к функциям lock(), try_lock()и unlock().
Примечание. Если исключение распространяется за пределы std::lock, то для любого объекта m1, m2, …, для которого в результате обращения к lock()или try_lock()была успешно получена блокировка, гарантированно будет вызвана функция unlock().
D.5.8. Шаблон функции std::try_lock
Шаблон функции std::try_lockпредоставляет возможность захватить сразу несколько допускающих блокировку объектов, так что либо захвачены все, либо ни один.
Объявление
template
int try_lock(LockableType1& m1, LockableType2& m2...);
Предусловия
Типы параметров LockableType1, LockableType2, … должны удовлетворять требованиям концепции Lockable.
Результат
Пытается захватить все объекты m1, m2, … допускающих блокировку типов, обращаясь по очереди к функции try_lock()каждого из них. Если try_lock()вернёт falseили возбудит исключение, то уже захваченные блокировки освобождаются путем вызова функции unlock()соответствующего объекта.
Возвращаемое значение
-1, если были захвачены все блокировки (то есть все вызовы try_lock()вернули true), в противном случае начинающийся с нуля индекс объекта, для которого вызов try_lock()вернул false.
Постусловия
Если функция вернула -1, то текущий поток захватил все переданные в аргументах объекты. В противном случае все объекты, которая функция успела захватить, освобождены.
Исключения
Любое исключение, возбуждаемое обращениями к функции try_lock.
Примечание. Если исключение распространяется за пределы std::try_lock, то для любого объекта m1, m2, …, для которого в результате обращения к try_lock()была успешно получена блокировка, гарантированно будет вызвана функция unlock().
Читать дальше