Результаты не определены, если вызывающий поток удерживает блокировку чтения-записи (будь то блокировку чтения или записи) во время вызова.
Это с страница Open Group на pthread_rwlock_wrlock
.
То, что вы делаете, не определено, по крайней мере, в этой версии спецификации.Вам повезло, что злобные обезьяны не влетели в окно и не забили вас до смерти: -)
В любом случае вам действительно следует проверять код возврата во всех ваших функциях pthread.Они могут потерпеть неудачу, и вы действительно не хотите продолжать, предполагая, что у вас есть блокировка, когда на самом деле вы не делаете, , так как этот тип сводит на нет полезность блокировок.
Эта же страница связана с указанными выше состояниями:
Функции pthread_rwlock_wrlock()
и pthread_rwlock_trywrlock()
могут не работать, если:
[EINVAL]
- значение, указанное в rwlock, необратитесь к инициализированному объекту блокировки чтения-записи.
[EDEADLK]
- текущий поток уже владеет блокировкой чтения-записи для записи или чтения.
Я бы проверил, действительно ли вы получаете код ошибки EDEADLK
.Этот код ошибки возможен даже в последних выпусках потоков POSIX , где, как указывает Немо в комментарии, «неопределенная» формулировка была удалена.
Одна вещьвсе еще беспокойство однако.В последней спецификации указывается, что «вызывающий поток может тупиковый, если во время вызова он удерживает блокировку чтения-записи» (мой жирный).
Я вижу это как фактический тупик, т. Е. Поток полностью блокируется.В разделе кода ошибки EDEADLK
также говорится, что "pthread_rwlock_wrlock()
функция может завершиться ошибкой, если ..." (опять же, мой жирный шрифт).
Оба эти утверждения имеют слово "ласка"может "в них, так что до сих пор неясно, что произойдет в любой конкретной ситуации.Может быть (без каламбура), что это было оставлено неуказанным, потому что некоторые реализации вели себя по-разному (не всегда легко обнаружить тупиковую ситуацию заранее), хотя это чистое предположение с моей стороны.
Суть, если вы знаю у вас есть какая-то рекурсивная блокировка (где вы можете разблокировать безнаказанно), не делайте этого.