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 не захвачен вызывающим потоком.
Исключения
Нет.