Примечание. Если 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().
D.5.9. Класс std::once_flag
Экземпляры класса std::once_flag используются совместно с шаблоном функции std::call_once для гарантии того, что некая функция будет вызвала ровно один раз, даже если ее могут вызывать одновременно несколько потоков.
Экземпляры std::once_flag не удовлетворяют требованиям концепций CopyConstructible, CopyAssignable, MoveConstructible и MoveAssignable.
struct once_flag {
constexpr once_flag() noexcept;
once_flag(once_flag const&) = delete;
once_flag& operator=(once_flag const&) = delete;
};
STD::ONCE_FLAG, КОНСТРУКТОР ПО УМОЛЧАНИЮ
Создает объект std::once_flag в состоянии, обозначающем, что ассоциированная функция еще не вызывалась.
constexpr once_flag() noexcept;