2010-02-03 3 views
23

У меня есть некоторые вопросы относительно блокировок чтения и записи в POSIX Pthreads в системе * nix, скажем, Linux.Как предотвратить голодание писателя в режиме чтения записи в pthreads

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

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

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

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

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

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

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

+0

Использование мьютекса вместо rwlock позволит избежать этой проблемы. Если соперничество низкое, оно также быстрее в некоторых реализациях (таких как те, которые строят rwlock из мьютекса и переменной условия). – jilles

ответ

35

Это действительно зависит от реализации - так, так как вы спросили о 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 ля ви). Вы можете подтвердить все это, проверив источники (все это очень читаемо) в pthread_rwlock_rdlock.c и pthread_rwlock_unlock.c.

Обратите внимание, что есть также PTHREAD_RWLOCK_PREFER_WRITER_NP, но это, кажется не иметь правильный эффект - вполне возможно, ошибка (или, возможно, нет - см comment by jilles below).

+0

большое спасибо. Это то, что я искал. Еще одна вещь - это функция pthread_rwlockattr_setkind_np() POSIX api или только конкретный linux? Я не мог увидеть его в заголовочном файле /usr/include/pthread.h в моей Linux-системе (может быть, старый). И что означает «np»? Большое спасибо :) – ghayalcoder

+1

Он указан как расширение UNIX98: http://nptl.bullopensource.org/Tests/Optimization-level-in-nptl.html, но я считаю, что это ошибка, и на самом деле это расширение GNU (как все остальные функции заканчиваются на '_np'). Конечно, на практике он недоступен в других местах. Я предполагаю, что '_np' является коротким для' NPTL', что означает «Native POSIX Threads Library». Я не уверен, какая именно версия glibc представила ее, но glibc 2.7 на моем ящике есть. Может быть, спросите в списке рассылки glibc? – caf

+0

Большое спасибо caf :) – ghayalcoder

 Смежные вопросы

  • Нет связанных вопросов^_^