Примечание
. Функция может не захватить мьютекс (и вернутьfalse
), даже если никакой другой поток не удерживает *this
.STD::MUTEX::UNLOCK
Освобождает объект std::mutex
void unlock();
Вызывающий поток должен удерживать мьютекс *this
Освобождает мьютекс std::mutex
Если другие потоки были блокированы в ожидании *this
*this
Нет.
D.5.2. Класс std::recursive_mutex
Класс std::recursive_mutex
lock()
или try_lock()
. В любой момент времени удерживать мьютекс может только один поток; если другой поток попытается захватить тот же мьютекс, то функция try_lock()
вернет ошибку, а функция lock()
приостановит выполнение потока. Закончив операции над разделяемыми данными, поток должен вызвать функцию unlock()
, чтобы освободить мьютекс и дать другим потокам возможность захватить его.Этот мьютекс называетс
std::recursive_mutex
, может снова обратиться к функции lock()
или try_lock()
, что приведёт к увеличению счетчика захватов. Никакой другой поток не сможет захватить этот мьютекс, пока владеющий им поток не вызовет функцию unlock
столько раз, сколько было успешных вызовов lock()
или try_lock()
.Экземпляр std::recursive_mutex
Lockable
.class recursive_mutex {
public:
recursive_mutex(recursive_mutex const&) = delete;
recursive_mutex& operator=(recursive_mutex const&) = delete;
recursive_mutex() noexcept;
~recursive_mutex();
void lock();
void unlock();
bool try_lock() noexcept;
};
STD::RECURSIVE_MUTEX
Конструирует объект std::recursive_mutex
recursive_mutex() noexcept;
Конструирует экземпляр std::recursive_mutex
Вновь сконструированный объект std::recursive_mutex
Исключение типа std::system_error
std::recursive_mutex
.STD::RECURSIVE_MUTEX
Уничтожает объект std::recursive_mutex
~recursive_mutex();
Объект *this
Уничтожает *this
Нет.
STD::RECURSIVE_MUTEX::LOCK
Захватывает объект std::recursive_mutex
void lock();
Блокирует текущий поток, пока мьютекс *this
*this
*this
, то счетчик захватов увеличивается на единицу.Исключение типа std::system_error
STD::RECURSIVE_MUTEX::TRY_LOCK
Пытается захватить объект std::recursive_mutex
bool try_lock() noexcept;
Пытается захватить объект std::recursive_mutex
true
false
.*this
true
.Нет.