Ошибка уничтожить блокировку, которая все еще удерживается текущим потоком?
Да, это так.POSIX говорит:
Результаты не определены, если pthread_rwlock_destroy()
вызывается, когда какой-либо поток содержит rwlock
.
Это ясно - «любой поток» включает текущий поток.
Причина будет в следующем: либо другой поток может стремиться захватить блокировку с текущим потоком pthread_rwlock_destroy()
, либо нет.Если это может быть, то программа уже ошибочна, потому что попытка заблокировать неинициализированную блокировку не определена;если это невозможно, то текущему потоку достаточно сначала разблокировать блокировку, а затем уничтожить ее.
Если это так, как я могу предотвратить блокировку других потоков и получение доступа к ресурсу, когда ясобираюсь уничтожить оба?
Приведенные выше рассуждения намекают на ответ на этот вопрос - чтобы уничтожить объект, включая замок внутри него, вы должны сначала сделать его недоступным для любогодругая нить.Вы могли бы сделать это, удалив все ссылки на него из других структур данных, что, вероятно, включает в себя снятие и снятие других блокировок, но как только вы изолировали сам объект, вы можете безопасно разблокировать его, потому что ваш поток должен содержать единственную оставшуюся ссылку.