Подтвердить что ты не робот

Как предотвратить голодание писателя в режиме чтения записи в pthreads

У меня есть некоторые вопросы, касающиеся блокировок чтения и записи в POSIX Pthreads в системе * nix, например Linux.

Я хочу знать, что такое смещение по умолчанию для блокировки записи чтения. Предпочитает ли он читать записи или наоборот? Предоставляет ли она api изменение этого поведения по умолчанию.

Предоставляет ли posix pthread некоторый api, чтобы мы могли изменить pthread_rwlock_t, чтобы предотвратить голодание писателя? Из того, что я прочитал (пожалуйста, поправьте меня, если я ошибаюсь), реализация по умолчанию смещена в сторону потоков читателей, и поэтому потоки писателя могут столкнуться с голодом.

Я прочитал пример реализации rw lock из книги "Программирование с помощью потоков Posix" Дэвида Бутенхофа.

Я хочу знать, как posix pthreads обрабатывают голодание писательских потоков? Есть ли какое-нибудь api-приложение, в котором мы могли бы установить атрибуты блокировки записи чтения, которые предотвратили бы запись голода (я никогда не слышал об этом)? Или пользователь должен решить эту проблему?

Если вы считаете, что ответ определен реализацией, пожалуйста, дайте мне пример того, как это делается в Linux, потому что это то, что я ищу.

Обратите внимание, что я просто хочу решения для системы * nix. Не думайте, что я груб, но публикация какого-то кода для Windows бесполезна для меня.

Спасибо всем за вашу помощь и терпение:)

4b9b3361

Ответ 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 ниже).