Ответ 1
Это действительно зависит от реализации, поэтому, поскольку вы спросили о Linux конкретно, мои комментарии относятся к текущей реализации NPTL pthreads, которая используется в современном glibc.
Здесь есть две связанные, но отдельные проблемы. Во-первых, есть такая ситуация:
- В настоящее время хранятся блокировки чтения, а авторы ждут. Новый поток пытается сделать блокировку чтения.
Действие по умолчанию здесь - позволить читателю продолжить - эффективно "перепрыгнуть очередь" над писателем. Однако вы можете переопределить это. Если вы используете функцию pthread_rwlockattr_setkind_np()
для установки флага PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP
на attr
, который вы передаете на pthread_rwlock_init()
, тогда ваш rwlock заблокирует читателя в вышеуказанной ситуации.
Вторая ситуация:
- Последний держатель освобождает блокировку, и ожидаются как читатели, так и писатели.
В этой ситуации NPTL всегда будет пробуждать автора, предпочитая читателя.
Взятое вместе, это означает, что если вы используете флаг PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP
, ваши писатели не должны голодать (конечно, теперь непрерывный поток писателей может голодать читателям. C'est la vie). Вы можете подтвердить все это, проверив источники (все это очень читаемые) в pthread_rwlock_rdlock.c и pthread_rwlock_unlock.c.
Обратите внимание, что существует также PTHREAD_RWLOCK_PREFER_WRITER_NP
, но он, похоже, не имеет правильного эффекта - вполне возможно, ошибка (или, возможно, нет - см. jilles ниже).