-->

QNX/UNIX: Анатомия параллелизма

На нашем литературном портале можно бесплатно читать книгу QNX/UNIX: Анатомия параллелизма, Цилюрик Олег Иванович-- . Жанр: Программирование / ОС и Сети. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
QNX/UNIX: Анатомия параллелизма
Название: QNX/UNIX: Анатомия параллелизма
Дата добавления: 16 январь 2020
Количество просмотров: 317
Читать онлайн

QNX/UNIX: Анатомия параллелизма читать книгу онлайн

QNX/UNIX: Анатомия параллелизма - читать бесплатно онлайн , автор Цилюрик Олег Иванович

Книга адресована программистам, работающим в самых разнообразных ОС UNIX. Авторы предлагают шире взглянуть на возможности параллельной организации вычислительного процесса в традиционном программировании. Особый акцент делается на потоках (threads), а именно на тех возможностях и сложностях, которые были привнесены в технику параллельных вычислений этой относительно новой парадигмой программирования. На примерах реальных кодов показываются приемы и преимущества параллельной организации вычислительного процесса. Некоторые из результатов испытаний тестовых примеров будут большим сюрпризом даже для самых бывалых программистов. Тем не менее излагаемые техники вполне доступны и начинающим программистам: для изучения материала требуется базовое знание языка программирования C/C++ и некоторое понимание «устройства» современных многозадачных ОС UNIX.

В качестве «испытательной площадки» для тестовых фрагментов выбрана ОСРВ QNX, что позволило с единой точки зрения взглянуть как на специфические механизмы микроядерной архитектуры QNX, так и на универсальные механизмы POSIX. В этом качестве книга может быть интересна и тем, кто не использует (и не планирует никогда использовать) ОС QNX: программистам в Linux, FreeBSD, NetBSD, Solaris и других традиционных ОС UNIX.

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

1 ... 71 72 73 74 75 76 77 78 79 ... 106 ВПЕРЕД
Перейти на страницу:

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

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

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

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

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

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
;

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

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

Функция

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

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

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

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

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

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

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

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

Функция

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
;

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

Функция

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

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

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

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

1 ... 71 72 73 74 75 76 77 78 79 ... 106 ВПЕРЕД
Перейти на страницу:
Комментариев (0)
название