Примечание
. Если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;