D.5.1. Класс std::mutex

Класс std::mutex предоставляет базовые средства взаимного исключения и синхронизации потоков, применяемые для защиты разделяемых данных. Перед тем как обращаться к данным, защищаемым мьютексом, этот мьютекс необходимо захватить (или заблокировать), вызвав функцию lock() или try_lock(). В любой момент времени удерживать мьютекс может только один поток; если другой поток попытается захватить тот же мьютекс, то функция try_lock() вернет ошибку, а функция lock() приостановит выполнение потока. Закончив операции над разделяемыми данными, поток должен вызвать функцию unlock(), чтобы освободить мьютекс и дать другим потокам возможность захватить его.

Экземпляр std::mutex удовлетворяет требованиям концепции Lockable.

Определение класса

class mutex {

public:

 mutex(mutex const&)=delete;

 mutex& operator=(mutex const&)=delete;

 constexpr mutex() noexcept;

 ~mutex();

 void lock();

 void unlock();

 bool try_lock();

};

STD::MUTEX , КОНСТРУКТОР ПО УМОЛЧАНИЮ

Конструирует объект std::mutex.

Объявление

constexpr mutex() noexcept;

Результат

Конструирует экземпляр std::mutex.

Постусловия

Вновь сконструированный объект std::mutex первоначально не захвачен.

Исключения

Нет.

STD::MUTEX , ДЕСТРУКТОР

Уничтожает объект std::mutex.

Объявление

~mutex();

Предусловия

Объект *this не должен быть захвачен.

Результат

Уничтожает *this.

Исключения

Нет.

STD::MUTEX::LOCK , ФУНКЦИЯ-ЧЛЕН

Захватывает объект std::mutex для текущего потока.

Объявление

void lock();

Предусловия

Вызывающий поток не должен удерживать мьютекс *this.

Результат

Блокирует текущий поток, пока мьютекс *this не будет захвачен.

Постусловия

*this захвачен текущим потоком.

Исключения

Исключение типа std::system_error в случае ошибки.

STD::MUTEX::TRY_LOCK , ФУНКЦИЯ-ЧЛЕН

Пытается захватить объект std::mutex для текущего потока.

Объявление

bool try_lock();

Предусловия

Вызывающий поток не должен удерживать мьютекс *this.

Результат

Пытается захватить объект std::mutex для текущего потока без блокирования.

Возвращаемое значение

true, если вызывающий поток захватил мьютекс, иначе false.

Постусловия

*this захвачен вызывающим потоком, если функция вернула true.

Исключения

Нет.

Примечание. Функция может не захватить мьютекс (и вернуть false), даже если никакой другой поток не удерживает *this.

STD::MUTEX::UNLOCK , ФУНКЦИЯ-ЧЛЕН

Освобождает объект std::mutex, удерживаемый текущим потоком.

Объявление

void unlock();

Предусловия

Вызывающий поток должен удерживать мьютекс *this.

Результат

Освобождает мьютекс std::mutex, удерживаемый текущим потоком.

Если другие потоки были блокированы в ожидании *this, то один из них разблокируется.

Постусловия

*this не захвачен вызывающим потоком.

Исключения

Нет.