Pthread_rwlock_destroy заблокированного мьютекса

При снятии блокировки чтения/записи Helgrind сообщил о следующей ошибке:

pthread_rwlock_destroy of a locked mutex

Если оставить в стороне тот факт, что я уничтожаю блокировку, а не мьютекс (хотя реализация библиотеки может полагаться на мьютексы), ошибка, вероятно, верна, тем более что последующая попытка снять блокировку помечается Helgrind как высвобождающая недействительную блокировку. замок.

Я понимаю, что разрушение блокировки, удерживаемой другим потоком, вероятно, является ошибкой. (Блокировки обычно уничтожаются вместе с ресурсом, который они защищают, и если блокировка удерживается, это означает, что ресурс все еще используется и не должен быть уничтожен).

Теперь мои вопросы:

  • Является ли ошибкой уничтожение блокировки, которая все еще удерживается потоком ток?
  • Если да, то какова причина этого?
  • Если да, то как я могу предотвратить захват блокировки другими потоками и возиться с ресурсом, когда я собираюсь уничтожить оба?
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
142
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Is it an error to destroy a lock that is still being held by the current thread?

Да это так. POSIX говорит:

Results are undefined if pthread_rwlock_destroy() is called when any thread holds rwlock.

Это понятно — «любой поток» включает в себя текущий поток.

Рассуждение будет примерно таким: либо другой поток может состязаться за блокировку с pthread_rwlock_destroy() текущего потока, либо он не может. Если будет могу, то программа уже ошибочна, т.к. попытка блокировки неинициализированной блокировки не определена; если это невозможно, то текущему потоку достаточно сначала разблокировать блокировку, а затем разрушить ее.

If so, how can I prevent other threads from acquiring the lock and messing with the resource when I am about to destroy both?

Рассуждения выше намекают на ответ на это — чтобы уничтожить объект, включая блокировку внутри него, вы должны первый сделать его недоступным для любого другого потока. Вы бы сделали это, удалив все ссылки на него из других структур данных, что, вероятно, включает в себя снятие и снятие других блокировок, но как только вы изолируете сам объект, вы можете безопасно разблокировать его, потому что ваш поток должен тогда удерживать единственную оставшуюся ссылку.

Другие вопросы по теме