LINUX.ORG.RU

pthread_rwlock


0

0


Linux/i386 2.6.9 + glibc 2.3.4
Linux/x86_64 2.6.18 + glibc 2.6.1

есть некий объект, защищенный rwlock-ом и есть достаточно большое количество потоков (несколько сотен), которые к нему обращаются. в 99.999% процентов случаев обращение идет на чтение -> берется read lock, после чего объект держится заблокированным какое-то время (~несколько секунд). однако, иногда состояние объекта нужно изменить -> берется write lock. объект очень популярен, i.e. практически постоянно кто-то да держит его заблокированным на чтение.

проблема: практически невозможно взять write lock, i.e. эта операция занимает *очень* много времени (минуты-десятки минут).

http://www.opengroup.org/onlinepubs/009695399/functions/pthread_rwlock_wrlock...

--- cut ---
Implementations may favor writers over readers to avoid writer starvation.
--- cut ---

вопрос: реализована ли в Linux приоритет писателей над читателями, или они равноправны? бо судя по его поведению, write lock ждет момента, когда лок будет полностью свободен не притормаживая при этом читателей -> дожидается его он очень и очень не скоро..

ps: rwlock создается с атрибутами по-умолчанию (NULL).

// wbr


впрочем, не исключено, что Linux specific pthread_rwlockattr_setkind_np может спасти жертву API костылей и подпорок. попробуем..

// wbr

klalafuda ★☆☆
() автор топика

в теории :

pthread_rwlockattr_t attr;
pthread_rwlockattr_init(&attr);
pthread_rwlockattr_setkind_np(&attr,PTHREAD_RWLOCK_PREFER_WRITER_NP);

на практике не проверял

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

> в теории :
> pthread_rwlockattr_t attr;
> pthread_rwlockattr_init(&attr);
> pthread_rwlockattr_setkind_np(&attr,PTHREAD_RWLOCK_PREFER_WRITER_NP);

AFAIU это Linux specific, i.e. в POSIX pthread API нет таких вызовов. а жаль.

> на практике не проверял

если судить по коду glibc должно работать. щас проверим :)

// wbr

klalafuda ★☆☆
() автор топика
Ответ на: комментарий от MKuznetsov

> pthread_rwlockattr_t attr;
> pthread_rwlockattr_init(&attr);
> pthread_rwlockattr_setkind_np(&attr,PTHREAD_RWLOCK_PREFER_WRITER_NP);

все правильно, с одним лишь но: тип должен быть PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP.
в противном случае, это работать не будет, в том числе и с PTHREAD_RWLOCK_PREFER_WRITER_NP :)

http://sourceware.org/ml/glibc-bugs/2007-08/msg00151.html

// wbr

klalafuda ★☆☆
() автор топика
Ответ на: комментарий от klalafuda

> все правильно, с одним лишь но: тип должен быть PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP. в противном случае, это работать не будет, в том числе и с PTHREAD_RWLOCK_PREFER_WRITER_NP :)

...ну и как следствие, лок нельзя брать рекурсивно, что в общем то не есть большая потеря.

// wbr

klalafuda ★☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.