LINUX.ORG.RU

pthread_rwlock_wrlock


0

0

Кто работал с subj ?

Что то я не вижу разницы с pthread_mutex В чем разница то, что то я никак уловить не могу ...

anonymous

Mutex - это имключающая одновременный доступ блокировка, при этом не важно читаешь данные или меняешь их - одновременно потоки этого делать не могут. RWLock - это блокировка чтения/записи, если "взвести" флаг блокировки чтения (pthread_rwlock_rdlock), то это не исключает возможности, чтобы другие потоки успешно выполнили эту же операцию, т.е. данные могут читать несколько потоков одновременно, при этом попытка получить достут для изменения данных (pthread_rwlock_wrlock) заблокирует вызывающий поток пока не будут сняты все блокировки чтения. Если поток успешно блокирует данные на запись (pthread_rwlock_wrlock), то все попытки выполнить блокировку, не важно чтения или записи, заблокируют вызывающий поток.

AVI
()

Это в какой либе такое есть?

В стандартном мане ничего подобного.

anonymous
()

> при этом попытка получить достут для изменения данных
> (pthread_rwlock_wrlock) заблокирует вызывающий поток пока не будут
> сняты все блокировки чтения. Если поток успешно блокирует данные
> на запись (pthread_rwlock_wrlock), то все попытки выполнить
> блокировку, не важно чтения или записи, заблокируют вызывающий
> поток.

это моменты реализации - то что исключено одновременная запись и чтение это факт а вот будет ли блокировать записывающий это не факт возможно такая реализация когда при запросе такого лока на запись если есть уже писатель то надо поспать если есть только читатели то они могут быть заблокированы(в соответствии с параметрами проставленными писателем) с последующим реентером в критичиский участок после обновления данных. Это более сложная реализация но более гибкая т.к. писатель может решать будут ли считаны старые или новые данные - ну а в классической реализации(POSIX?) помоему все в точности так как ты написал

lg ★★
()

Если я правильно помню, то в man'е нет описаний на pthread_rwlock_*, я смотрел в стандарте POSIX (1003.1-2001), стандарт можно посмотреть здесь: http://www.opengroup.org/onlinepubs/007904975/idx/index.html. Можно смотреть прямо файл pthread.h. У меня на RedHat 7.2 чтобы компилировались программы, использующие вызовы pthread_rwlock_* (и все остальные вызовы, которых не было в предыдущей версии стандарта) надо определить макрос _GNU_SOURCE (например так: gcc -D_GNU_SOURCE -o test test.c).

AVI
()

Для anonymous - все эти вызовы находятся в libpthread. Правда в RedHat 9 появилась NPTL (Native POSIX Thread Library), где у них эти вызовы реализованы я точно не знаю.

AVI
()

Можно смотреть в книге У. Стивенсона (том 2 изд. Питер) - таместь описание и примеры работы, реализация сабжа через mutex где лежит - grep по /lib, /usr/lib - обычно где-то там ( обычно - lpthread (lposix и т.п. реже, кой-чего из POSIX бывало в libr_t и подобных )

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