Разблокируется ли unique_lock при уничтожении, если мы уже разблокировали его вручную? - PullRequest
2 голосов
/ 19 марта 2019

Вызывается ли функция unique_lock::unlock() при уничтожении, даже если я вызвал unlock вручную, чтобы сигнал разблокировки был получен на данном мьютексе дважды?

Ответы [ 3 ]

3 голосов
/ 19 марта 2019

Нет, он не будет пытаться разблокировать. Если вы посмотрите на unlock, это

Гарантирует: owns == false.

и Деструктор

Эффекты: если owns вызывает pm->unlock().

, так как unlock освобождает владельца, деструктор не будет пытаться разблокировать его.

1 голос
/ 19 марта 2019

Нет.См. Документацию :

Если *this имеет связанный мьютекс и приобрел его право собственности, мьютекс разблокируется.

0 голосов
/ 19 марта 2019

Не это не так.

Рассмотрим точку зрения mutex, где std::mutex::unlock (из cppreference ):

Разблокирует мьютекс.

Мьютекс должен быть заблокирован текущим потоком выполнения, в противном случае поведение не определено.

Следовательно, было бы фатальным, если бы блокировка вызывала unlock наmutex, который больше не заблокирован.

...