Составители:
29
ласть данных, из которой в этот момент ведется чтение. В противном слу-
чае может нарушиться целостность данных. Блокировка создается вызовом
int pthread_rwlock_init(
pthread_rwlock_t * rwl, // объект блокировки
const pthread_rwlockattr_t * attr ); // атрибуты
где rwl – указатель к объекту блокировка чтения/записи, attr – указатель к
набору атрибутов. Блокировка разрешает всем потокам доступ по чтению к
некоторой области данных с помощью вызова:
pthread_rwlock_rdlock( pthread_rwlock_t* rwl );
но когда поток, желающий выполнить запись, обращается с вызовом
pthread_rwlock_wrlock(pthread_rwlock_t* rwl ),
то требование записи блокируется до тех пор, пока все читающие потоки
завершат чтение области данных. Множество пишущих потоков упорядочи-
вается в очередь (с учетом приоритетов) и ожидает возможности выполнить
запись к защищенной структуре данных. Приоритет читающих потоков не
учитывается.
На рис. 2.5 показана мнемоническая схема функционирования меха-
низма rwlock, когда активны потоки, выполняющие операции чтения. На рис.
2.6 показано функционирование механизма rwlock, когда активен пишущий
поток.
Имеются также специальные системные вызовы
pthread_rwlock_tryrdlock(pthread_rwlock_t* rwl );
pthread_rwlock_trywrlock(pthread_rwlock_t* rwl ),
позволяющие потокам проверить на допустимость выполнения действия
без блокировки потока. Важно отметить, что «проверочные версии» захва-
тывают объект rwlock, если он доступен. Это необходимо для того, чтобы
исключить опасную паузу между проверкой и доступом, поскольку в преде-
лах этой паузы может произойти модификация данных.
Thread 1
Thread 2
Thread 3
Rwlock
Thread 1
Thread 2
Thread 3
Thread 4
Thread 4
Blocked
Running
rdlock
rdlock
rdlock
wrlock
Рис. 2.6
Страницы
- « первая
- ‹ предыдущая
- …
- 27
- 28
- 29
- 30
- 31
- …
- следующая ›
- последняя »
