Захват блокировки чтения/записи

Захват блокировки чтения/записи

В связи со спецификой применения блокировок чтения/записи этот объект синхронизации имеет две группы функций захвата, позволяющих по-разному регулировать доступ к защищаемому участку кода.

К первой группе относятся функции, допускающие рекурсивный захват объекта синхронизации и совместное использование участка кода. Это так называемые функции блокировки по чтению.

Вторая группа функций допускает только эксклюзивный захват объекта синхронизации и к выполнению защищаемого кода допускается только один поток. Это функции блокировки по записи.

Функции блокировки по чтению

int pthread_rwlock_rdlock(pthread_rwlock_t* rwl);

int pthread_rwlock_tryrdlock(pthread_rwlock_t* rwl);

int pthread_rwlock_timedrdlock(pthread_rwlock_t* rwlock,

 const struct timespec* abs);

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

Первая функция в группе позволяет выполнить простой захват объекта синхронизации. При рекурсивном захвате с помощью любой из указанных функций необходимо помнить, что освобождение должно производиться столько же раз, сколько и захват.

Функция pthread_rwlock_rdlock() может возвращать следующие значения:

EOK — успешное выполнение;

EAGAIN — при первом использовании статически инициированной блокировки чтения/записи (PTHREAD_RWLOCK_INITIALIZER) недостаточно системных ресурсов для инициализации блокировки чтения/записи;

EDEADLK — вызывающий поток уже провел эксклюзивный захват (блокировку по записи) объекта синхронизации, на который ссылается rwl, и повторный захват на чтение привел бы к полному («мертвому») блокированию потока;

EFAULT — сбой при обращении ядра к rwl;

EINVALrwl указывает на неверный объект блокировки чтения/записи.

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

Функция pthread_rwlock_tryrdlock() возвращает следующие значения:

EOK — успешное выполнение;

EAGAIN — при первом использовании статически инициированной блокировки чтения/записи (PTHREAD_RWLOCK_INITIALIZER) недостаточно системных ресурсов для инициализации блокировки чтения/записи;

EBUSY — блокировка чтения/записи блокирована по записи (собственно, это и есть основной мотив использования именно этого вызова);

EDEADLK — вызывающий поток уже провел эксклюзивный захват (блокировку по записи) объекта синхронизации, на который ссылается rwl;

EFAULT — сбой при обращении ядра к rwl;

EINVALrwl указывает на неверный объект блокировки чтения/записи.

Третья функция из группы предусматривает завершение блокировки ожидания освобождения объекта синхронизации при возникновении блокировки по записи или по истечении заданного тайм-аута ожидания.

Функция pthread_rwlock_timedrdlock() может возвращать следующие коды ошибки:

EAGAIN — система не может захватить блокировку по чтению, поскольку достигнуто максимальное число блокировок чтения для данного объекта;[37]

EDEADLK — вызывающий поток уже является владельцем указанного объекта синхронизации; он захватил его, используя блокировку по записи, и повторная блокировка по чтению привела бы к полному блокированию потока;

EINVAL — неверный параметр вызова: либо rwl указывает на неинициализированный объект блокировки чтения/записи, либо время тайм-аута abs задано меньше нуля или равно или выше предельного значения 1000 миллионов;

ETIMEDOUT — не удалось захватить блокировку до истечения срока тайм-аута.

Функции блокировки по записи

int pthread_rwlock_wrlock(pthread_rwlock_t* rwl);

int pthread_rwlock_trywrlock(pthread_rwlock_t* rwl);

int pthread_rwlock_timedwrlock(pthread_rwlock_t* rwlock,

 const struct timespec* abs_timeout);

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

Функция pthread_rwlock_wrlock() возвращает следующие значения:

EOK — успешное выполнение;

EAGAIN — при первом использовании статически инициированной блокировки чтения/записи (PTHREAD_RWLOCK_INITIALIZER) недостаточно системных ресурсов для инициализации блокировки чтения/записи;

EDEADLK — вызывающий поток уже является владельцем блокировки в эксклюзивном режиме;

EFAULT — сбой при обращении ядра к rwl;

EINVALrwl указывает на неверный объект блокировки чтения/записи.

Функция pthread_rwlock_trywrlock() возвращает значения:

EOK — успешное выполнение;

EAGAIN — при первом использовании статически инициированной блокировки чтения/записи (PTHREAD_RWLOCK_INITIALIZER) недостаточно системных ресурсов для инициализации блокировки чтения/записи;

EBUSY — блокировка уже захвачена в режиме чтения или записи;

EDEADLK — вызывающий поток уже является владельцем блокировки в эксклюзивном режиме;

EFAULT — сбой при обращении ядра к rwl;

EINVALrwl указывает на неверный объект блокировки чтения/записи.

Функция pthread_rwlock_timedwrlock() возвращает значения:

EOK — успешное выполнение;

EAGAIN — система не может захватить блокировку по записи, поскольку достигнуто максимальное число блокировок по записи для данного объекта;

EDEADLK — вызывающий поток уже является владельцем блокировки в эксклюзивном режиме;

EINVAL — неверный параметр вызова: либо rwl указывает на неинициализированный объект блокировки чтения/записи, либо время тайм-аута abs задано меньше нуля или равно или выше предельного значения 1000 миллионов;

ETIMEDOUT — не удалось захватить блокировку до истечения заданного срока тайм-аута.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

5.4 ЗАХВАТ ФАЙЛА И ЗАПИСИ

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

5.4 ЗАХВАТ ФАЙЛА И ЗАПИСИ В первой версии системы UNIX, разработанной Томпсоном и Ричи, отсутствовал внутренний механизм, с помощью которого процессу мог бы быть обеспечен исключительный доступ к файлу. Механизм захвата был признан излишним, поскольку, как отмечает Ричи, «мы


1.4. Устройства чтения/записи CD и DVD

Из книги Nero 8 автора Кашеваров А

1.4. Устройства чтения/записи CD и DVD В настоящее время существуют устройства, которые могут только читать CD и DVD, но не могут их записывать, и устройства, которые могут и читать, и записывать диски. Первый тип устройств называется приводами CD-ROM или DVD-ROM. Они сравнительно


Основные принципы чтения и записи XML-данных

Из книги Обработка баз данных на Visual Basic®.NET автора Мак-Манус Джеффри П

Основные принципы чтения и записи XML-данных В главах 5, "ADO.NET: объект DataSet", и 6, "ADO.NET: объект DataAdapter" демонстрируются программируемые и прямые способы загрузки данных в объект DataSet из базы данных. Еще один метод загрузки данных основан на чтении XML-данных. Как и следовало


2.3.3.1 Прозрачный доступ для чтения и записи

Из книги Руководство администратора баз данных Informix. автора Кустов Виктор

2.3.3.1 Прозрачный доступ для чтения и записи Enterprise Gateway представляет собой единый шлюз, который обеспечивает прозрачный доступ к данным в масштабах предприятия. Конечные пользователи обращаются к Enterprise Gateway так же, как к серверу баз данных INFORMIX. Доступ на чтение и запись


ГЛАВА 8 Блокировки чтения-записи

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

ГЛАВА 8 Блокировки чтения-записи 8.1. Введение Взаимное исключение используется для предотвращения одновременного доступа нескольких потоков к критической области. Критическая область кода обычно содержит операции считывания или изменения данных, используемых


8.2. Получение и сброс блокировки чтения-записи

Из книги QNX/UNIX [Анатомия параллелизма] автора Цилюрик Олег Иванович

8.2. Получение и сброс блокировки чтения-записи Блокировка чтения-записи имеет тип pthread_rwlock_t. Если переменная этого типа является статической, она может быть проинициализирована присваиванием значения константы PTHREAD_RWLOCK_INITIALIZER.Функция pthread_rwlock_rdlock позволяет заблокировать


8.3. Атрибуты блокировки чтения-записи

Из книги Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform автора Кёртен Роб

8.3. Атрибуты блокировки чтения-записи Мы уже отмечали, что статическая блокировка может быть проинициализирована присваиванием ей значения PTHREAD_RWLOCK_INITIALIZER. Эти переменные могут быть проинициализированы и динамически путем вызова функции pthread_rwlock_init. Когда поток


9.6. Приоритет чтения и записи

Из книги Разработка ядра Linux автора Лав Роберт

9.6. Приоритет чтения и записи В нашей реализации блокировок чтения-записи в разделе 8.4 приоритет предоставлялся ожидающим записи процессам. Теперь мы изучим детали возможного решения задачи читателей и писателей с помощью блокировки записей fcntl. Хочется узнать, как


Блокировки чтения-записи

Из книги автора

Блокировки чтения-записи Пpoгрaммa, использующая блокировки чтения-записи, является слегка измененной версией программы с взаимными исключениями Posix. Поток должен установить блокировку файла, прежде чем увеличивать общий счетчик. ПРИМЕЧАНИЕ Существует не так уж много


Захват и освобождение ждущей блокировки

Из книги автора

Захват и освобождение ждущей блокировки Вызов функций ожидания может производиться только внутри блока захвата и освобождения ждущей блокировки:int pthread_sleepon_lock(void);int pthread_sleepon_unlock(void);Функция захвата pthread_sleepon_lock() возвращает следующие значения:EOK — успешное выполнение;EDEADLK


Блокировки чтения/записи

Из книги автора

Блокировки чтения/записи Блокировка чтения/записи является специфическим механизмом, отличающимся от рассмотренных выше. Специфика состоит в следующем:• Данный тип блокировки даже по POSIX является альтернативным. Часто этот тип блокировки может реализовываться как


Операции с блокировками чтения/записи

Из книги автора

Операции с блокировками чтения/записи Инициализация объекта блокировки int pthread_rwlock_init(pthread_rwlock_t* rwl, const pthread_rwlockattr_t* attr);int pthread_rwlock_destroy(pthread_rwlock_t* rwl);Вызов функций инициализирует/разрушает блокировку чтения/записи. При инициализации блокировки ей передается структура


Использование блокировок чтения/записи

Из книги автора

Использование блокировок чтения/записи Построим приложение, использующее блокировку чтения/записи (файл sy10.cc):Эффективность блокировки чтения/записи#include <sys/syspage.h>#include <sys/neutrino.h>#include <list>// сколь угодно сложные элементы внутренней базы данных// приложения; в


Блокировки чтения/записи

Из книги автора

Блокировки чтения/записи Блокировки чтения/записи применяются точно в соответствии с их названием: несколько «читателей» могут использовать ресурс в отсутствие «писателей», или один «писатель» может использовать ресурс в отсутствие «читателей» и других


Спин-блокировки чтения-записи

Из книги автора

Спин-блокировки чтения-записи Иногда в соответствии с целью использования блокировок их можно разделить два типа — блокировки чтения (reader lock) и блокировки записи (writer lock). Рассмотрим некоторый список, который может обновляться и в котором может выполняться поиск. Когда


Семафоры чтения-записи

Из книги автора

Семафоры чтения-записи Семафоры, так же как и спин-блокировки, могут быть типа чтения-записи. Ситуации, в которых предпочтительнее использовать семафоры чтения-записи такие же как и в случае использования спин-блокировок чтения-записи.Семафоры чтения-записи