QNX/UNIX: Анатомия параллелизма
QNX/UNIX: Анатомия параллелизма читать книгу онлайн
Книга адресована программистам, работающим в самых разнообразных ОС UNIX. Авторы предлагают шире взглянуть на возможности параллельной организации вычислительного процесса в традиционном программировании. Особый акцент делается на потоках (threads), а именно на тех возможностях и сложностях, которые были привнесены в технику параллельных вычислений этой относительно новой парадигмой программирования. На примерах реальных кодов показываются приемы и преимущества параллельной организации вычислительного процесса. Некоторые из результатов испытаний тестовых примеров будут большим сюрпризом даже для самых бывалых программистов. Тем не менее излагаемые техники вполне доступны и начинающим программистам: для изучения материала требуется базовое знание языка программирования C/C++ и некоторое понимание «устройства» современных многозадачных ОС UNIX.
В качестве «испытательной площадки» для тестовых фрагментов выбрана ОСРВ QNX, что позволило с единой точки зрения взглянуть как на специфические механизмы микроядерной архитектуры QNX, так и на универсальные механизмы POSIX. В этом качестве книга может быть интересна и тем, кто не использует (и не планирует никогда использовать) ОС QNX: программистам в Linux, FreeBSD, NetBSD, Solaris и других традиционных ОС UNIX.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
PTHREAD_RECURSIVE_ENABLE
PTHREAD_RECURSIVE_DISABLE
pthread_mutex_lock()
EDEADLK
Определение типа мьютекса
int pthread_mutexattr_settype(
pthread_mutexattr_t* attr, int type);
int pthread_mutexattr_gettype(
const pthread_mutexattr_t* attr, int* type);
В версиях QNX 6.2.1 и 6.3 предусматривается создание мьютексов следующих типов:
•
PTHREAD_MUTEX_NORMAL
•
PTHREAD_MUTEX_ERRORCHECK
• попытка повторного захвата мьютекса тем же потоком;
• попытка освобождения мьютекса, захваченного другим потоком;
• освобождение свободного мьютекса.
•
PTHREAD_MUTEX_RECURSIVE
Обратите внимание, что разрешение рекурсивного захвата мьютекса необходимо проводить установкой двух параметров (
type
recursive
•
PTHREAD_MUTEX_DEFAULT
Освобождение параметров
int pthread_mutexattr_destroy(pthread_mutexattr_t* attr);
Вызов разрушает ранее применявшийся объект - атрибутную запись мьютекса, после чего она уже не может более использоваться для инициализации мьютекса без предварительного выполнения вызова
pthread_mutexattr_init()
На этом обсуждение атрибутов заканчивается, и мы переходим непосредственно к функциям работы с мьютексом.
Операции над мьютексом
Инициализация мьютекса
int pthread_mutex_init(pthread_mutex_t* mutex,
const pthread_mutexattr_t* attr);
Структура данных
pthread_mutex_t
<pthread.h>
sync_t
<target_nto.h>
struct _sync_t {
/* Счетчик для рекурсивного мьютекса или семафора */
int count;
/* TID потока - имеет смысл и применяется только для мьютексов */
unsigned owner;
};
Функция
pthread_mutex_init()
attr
NULL
SyncTypeCreate()
SyncTypeCreate()
Вместо прямого вызова функции
pthread_mutex_init()
PTHREAD_MUTEX_INITIALIZER
PTHREAD_RMUTEX_INITIALIZER
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_RMUTEX_INITIALIZER;
Первый из них создает мьютекс в соответствии со значениями атрибутов по умолчанию, а второй - мьютекс с разрешенным рекурсивным захватом.
Операции с граничным приоритетом
Большинство параметров мьютекса не могут быть изменены после его создания. Но не все. В процессе работы с мьютексом может быть изменено значение приоритета, которое система использует для реализации протокола граничного приоритета с целью предотвращения инверсии приоритетов:
int pthread_mutex_setprioceiling(pthread_mutex_t* mutex,
int prioceiling, int* old_ceiling);
int pthread_mutex_getprioceiling(const pthread_mutex_t* mutex,
int* prioceiling);
Функция
pthread_mutex_setprioceiling()
old_ceiling
Функция возвращает следующие значения:
EOK
EINVAL
EPERM