Освобождает мьютекс *this
, удерживаемый текущим потоком. Если это последний захват *this
данным потоком, и другие потоки были блокированы в ожидании *this
, то один из них разблокируется.
Количество захватов *this
вызывающим потоком, уменьшается на единицу.
Нет.
D.5.5. Шаблон класса std::lock_guard
Шаблон класса std::lock_guard
предоставляет простую обертку владения блокировкой. Тип блокируемого мьютекса задается параметром шаблона Mutex
и должен удовлетворять требованиям концепции Lockable
. Заданный мьютекс захватывается в конструкторе и освобождается в деструкторе. Тем самым мы получаем простое средство захвата мьютекса в некотором блоке кода, которое гарантирует освобождение мьютекса при выходе из блока вне зависимости от того, как этот выход произведен: по достижении закрывающей скобки, в результате предложения, меняющего поток управления, например break
или return
, или вследствие исключения.
Экземпляры std::lock_guard
не удовлетворяют требованиям концепций MoveConstructible
, CopyConstructible
и CopyAssignable
.
template
class lock_guard {
public:
typedef Mutex mutex_type;
explicit lock_guard(mutex_type& m);
lock_guard(mutex_type& m, adopt_lock_t);
~lock_guard();
lock_guard(lock_guard const&) = delete;
lock_guard& operator=(lock_guard const&) = delete;
};
STD::LOCK_GUARD
, ЗАХВАТЫВАЮЩИЙ КОНСТРУКТОР
Конструирует экземпляр std::lock_guard
, который захватывает указанный мьютекс.
explicit lock_guard(mutex_type& m);
Конструирует экземпляр std::lock_guard
, который ссылается на указанный мьютекс. Вызывает m.lock()
.
Любое исключение, возбуждаемое m.lock()
.
*this
владеет блокировкой m
.
STD::LOCK_GUARD
, КОНСТРУКТОР, ПЕРЕНИМАЮЩИЙ БЛОКИРОВКУ
Конструирует экземпляр std::lock_guard
, который владеет блокировкой указанного мьютекса.
lock_guard(mutex_type& m, std::adopt_lock_t);
Вызывающий поток должен владеть блокировкой m
.
Конструирует экземпляр std::lock_guard
, который ссылается на указанный мьютекс и принимает владение блокировкой m
, удерживаемой вызывающим потоком.
Нет.
*this
владеет блокировкой m
, удерживаемой вызывающим потоком.
STD::LOCK_GUARD
, ДЕСТРУКТОР
Уничтожает экземпляр std::lock_guard
и освобождает соответствующий мьютекс.
~lock_guard();
Вызывает m.unlock()
для мьютекса m
, заданного при конструировании *this
.
Нет.
D.5.6. Шаблон класса std::unique_lock
Шаблон класса std::unique_lock
предоставляет более общую обертку владения блокировкой, чем std::lock_guard
. Тип блокируемого мьютекса задается параметром шаблона Mutex
и должен удовлетворять требованиям концепции BasicLockable
. Вообще говоря, заданный мьютекс захватывается в конструкторе и освобождается в деструкторе, хотя имеются также дополнительные конструкторы и функции-члены, предлагающие другие возможности. Тем самым мы получаем средство захвата мьютекса в некотором блоке кода, которое гарантирует освобождение мьютекса при выходе из блока вне зависимости от того, как этот выход произведен: по достижении закрывающей скобки, в результате предложения, меняющего поток управления, например break
или return
, или вследствие исключения.
Функции ожидания в классе std::condition_variable
требуют объекта std::unique_lock
, и любая конкретизация шаблона std::unique_lock
может быть использована в качестве параметра типа Lockable
в любом варианте функции wait
из класса std::condition_variable_any
.
Если тип Mutex
удовлетворяет требованиям концепции Lockable
, то им удовлетворяет и тип std::unique_lock
. Если, кроме того, тип Mutex
удовлетворяет требованиям концепции TimedLockable
, то им удовлетворяет и тип std::unique_lock
.
Экземпляры std::unique_lock
удовлетворяют требованиям концепций MoveConstructible
и MoveAssignable
, но не CopyConstructible
и CopyAssignable
.
template