Примечание. Функция может не захватить мьютекс (и вернуть 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.
Нет.