Параллельное и распределенное программирование на С++ (Хьюз, Хьюз) - страница 454

pthread_rwlock_rdlock, pthread_rwlock_tryrdlock

Имя

pthread_rwlock_rdlock, pthread_rwlock_tryrdlock— функции блокирования объекта блокировки чтения-записи для обеспечения чтения.

Синопсис

THR

#include

int pthread_rwlock_rdlock (pthread_rwlock_t *rwlock) ; int pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock) ;

Описание

Функция pthread_rwlock_rdlock() при м еняет блокировку для обеспечения чтения к объекгу блокировки чтения-записи, адресуе м о м у пара м етро м rwlock. Вызываю щ ий поток получает блокировку для чте н ия, если никакой записывающий поток не удерживает этот объект блокировки и не существует никаких других записывающих потоков, заблокированных по этому объекту.

TPS Если поддерживается опция Thread Execution Scheduling и потоки, участвующие в данной блокировке, выполняются с использованием стратегий планирования SCHED_FIFO или SCHED_RR, то вызывающий поток не получит эту блокировку, если ее удерживает записывающий поток или если по этому объекту блокировки заблокированы записывающие потоки такого же или более высокого приоритета; в противном случае вызывающий поток получит блокировку.

TSP TSP Если поддерживается опция Thread Execution Scheduling и потоки, участвующие в данной блокировке, выполняются с использованием стратегии планирования SCHED_SPORADIC, то вызывающий поток не получит эту блокировку, если ее удерживает записывающий поток или если по этому объекту блокировки заблокированы записывающие потоки такого же или более высокого приоритета; в противном случае вызывающий поток получит блокировку.

Если опция Thread Execution Scheduling не поддерживается, то только конкретнал реализация определяет, получит ли вызывающий поток эту блокировку, если никакой записывающий поток не удерживает этот объект блокировки и существуют другие записывающие потоки, заблокированные по этому объекту. Если записывающий поток удерживает этот объект блокировки, вызывающий поток не получит блокировку для чтения. Если блокировка для чтения не предоставлена, вызывающий поток блокируется до тех пор, пока он не получит блокировку. Вызывающий поток может попасть в ловушку взаимоблокировки, если во время вызова он удерживает блокировку для обеспечения записи.

Поток м ожет удерживать несколько параллельных блокировок для чтения по объекту rwlock (т.е. функция pthread_rwlock_rdlock () м ожет быть успешно вызвана n раз). В этом случае приложение должно гарантировать, что поток выполнит соответствующие действия по разблокировке объекта rwlock (т.е. он n раз вызовет функцию pthread_rwlock_unlock ()).