Использование блокировок чтения-записи для реализации стратегии доступа
Блокировки чтения-записи можно использовать для реализации стратегии доступа CREW (параллельное чтение и исключающая запись). Согласно этой стратегии возможность параллельно считывать данные может быть предоставлена сразу нескольким задачам, но только одна задача получит право доступа для записи. При выполнении монопольной записи в этом случае не будет дано разрешение на параллельное чтение данных. Использование блокировок чтения-записи для защиты критических разделов продемонстрировано в листинге 5.3.
// Листинг 5.3. Пример использования потоками блокировок
// чтения-записи
//...
pthread_t ThreadA, ThreadB, ThreadC, ThreadD ; pthread_rwlock_t RWLock;
void *producerl(void *X) {
pthread_rwlock_wrlock(&RWLock) ; // Критический раэдел.
pthread_rwlock_unlock(&RWLock) ; return(0);
}
void *producer2 (void *X) {
pthread_rwlock_wrlock(&RWLock) ; // Критический раздел.
pthread_rwlock_unlock(&RWLock) ;
}
void *consumerl(void *X) {
pthread_rwlock_rdlock(&RWLock); // Критический раздел.
pthread_rwlock_unlock(&RWLock); return(0);
}
void *consumer2(void *X) {
pthread_rwlock_rdlock(&RWLock); // Критический раздел.
pthread_rwlock__unlock(&RWLock); return(0);
}
int main(void) {
pthread_rwlock_init(&RWLock,NULL); // Устанавливаем атрибуты мьютекса. pthread_create(&ThreadA, NULL, producerl, NULL) pthread_create(&ThreadB, NULL, consumerl, NULL) pthread_create(&ThreadC,NULL,producer2,NULL) pthread_create(&ThreadD,NULL, consumer2,NULL) //.. .
return(0);
}
В листинге 5.3 создаются четыре потока. Два потока, ThreadA и ThreadC, выполняют роль изготовителей, а остальные два (ThreadB и ThreadD) — потребителей. Все потоки имеют критический раздел, который защищается объектом блокировки чтения-записи RWLock. Потоки ThreadB и ThreadD могут входить в свои критические разделы параллельно или последовательно, но это исключено, если поток ThreadA или ThreadC пребывает в своем критическом разделе. Потоки ThreadA и ThreadC не могут входить в свои критические разделы параллельно. Частичная таблица решении для листинга 5.3 показана в табл. 5.6.
Таблица 5.6. Час т ич н ая таблица решений для листинга 5.3
Поток А Поток В Поток С Поток D (выполняет запись) (выполняет чтение) (выполняет запись) (выполняет чтение) Нет Нет Нет Да Нет Нет Да Нет Нет Да Нет Нет Нет Да Нет Да Да Нет Нет НетБольше книг — больше знаний!
Заберите 30% скидку новым пользователям на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ