Является ли unique_lock :: unlock недостаточно определенным в стандарте C ++ 11? - PullRequest
5 голосов
/ 18 декабря 2011

Стандарт C ++ 11 определяет unique_lock::unlock как (§ 30.4.2.2.2, стр. 1159)

void unlock();
Effects: pm->unlock()
Postcondition: owns == false
Throws: system_error when an exception is required (30.2.2).
Error conditions:
  — operation_not_permitted — if on entry owns is false.

Все остальные операции блокировки указывают, что исключение выдается как минимум в двух случаях:

  • Мьютекс равен NULL (выбрасывает system_error с errc::operation_not_permitted)
  • Мьютекс уже заблокирован (выдает system_error с errc::operation_not_permitted)

Проблема с недопустимым мьютексом, очевидно, возможна и для unlock, однако, стандарт определяет поведение программы только для задач блокировки. Это настоящая ошибка в стандарте или я что-то упустил?

Ответы [ 2 ]

7 голосов
/ 18 декабря 2011

Хотя это явно не указано, unique_lock имеет следующие инварианты:

if pm == nullptr then owns == false
if owns == true then pm != nullptr

Нет никакого способа перевести unique_lock в состояние, которое нарушает эти инварианты, кроме как через неопределенное поведение. Итак, пункт:

— operation_not_permitted — if on entry owns is false.

охватывает случай, который pm == nullptr.

Обратите внимание, что ~unique_lock() вызывает pm->unlock(), только если owns имеет значение true. Если owns истинно, то pm != nullptr и, следовательно, unlock() не может бросить.

0 голосов
/ 18 декабря 2011

pm - это mutex_type, а определение для разблокировки в std::mutex:

void unlock() noexcept;

То есть функция unlock не может генерировать никаких исключений, поэтому unique_lock::unlock не делаетЯ должен унаследовать любое из этих исключений.Относительно того, почему он может генерировать любое исключение, остается загадкой.

Немного неприятно, что деструктор для unique_lock может выбросить исключение (так как я предполагаю, что ему, возможно, придется вызвать unlock там, гдеможет тоже).Это кажется мне плохим, поскольку использование объекта блокировки для правильной разблокировки во время обработки исключений - очень распространенная идиома.Очень плохо, что блокировка может генерировать исключение во время раскручивания стека - тем более, что нижележащий мьютекс не разрешен.

Что-то здесь определенно не так.

Явсе еще работает с последнего публичного проекта, возможно, это было исправлено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...