QNX/UNIX: Анатомия параллелизма
QNX/UNIX: Анатомия параллелизма читать книгу онлайн
Книга адресована программистам, работающим в самых разнообразных ОС UNIX. Авторы предлагают шире взглянуть на возможности параллельной организации вычислительного процесса в традиционном программировании. Особый акцент делается на потоках (threads), а именно на тех возможностях и сложностях, которые были привнесены в технику параллельных вычислений этой относительно новой парадигмой программирования. На примерах реальных кодов показываются приемы и преимущества параллельной организации вычислительного процесса. Некоторые из результатов испытаний тестовых примеров будут большим сюрпризом даже для самых бывалых программистов. Тем не менее излагаемые техники вполне доступны и начинающим программистам: для изучения материала требуется базовое знание языка программирования C/C++ и некоторое понимание «устройства» современных многозадачных ОС UNIX.
В качестве «испытательной площадки» для тестовых фрагментов выбрана ОСРВ QNX, что позволило с единой точки зрения взглянуть как на специфические механизмы микроядерной архитектуры QNX, так и на универсальные механизмы POSIX. В этом качестве книга может быть интересна и тем, кто не использует (и не планирует никогда использовать) ОС QNX: программистам в Linux, FreeBSD, NetBSD, Solaris и других традиционных ОС UNIX.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Возвращаемые значения:
EOK
EINVALattr.Инициализация условной переменной
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int pthread_cond_init(pthread_cond_t* cond, pthread_condattr_t* attr);Инициализирует условную переменную
condattrpthread_cond_init()namespacestaticPTHREAD_COND_INITIALIZERВозвращаемые значения:
EOK
EAGAIN
EBUSYcond
EFAULTcondattr
EINVALcondОжидание условия
int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);Вызов функции блокирует вызвавший поток на условной переменной
condmutexcondpthread_cond_signal()pthread_cond_broadcast()mutexmutexНе следует использовать условную переменную с мьютексом, у которого разрешен рекурсивный захват.
Возвращаемые значения:
EOK
EAGAIN
EFAULTcondmutex;
EINVAL• не инициализированы переменные, на которые указывают
condmutex;• попытка использования переменной, на которую указывает
cond• вызвавший поток не владеет указанным мьютексом.
#include <time.h>
int pthread_cond_timedwait(pthread_cond_t* cond,
pthread_mutex_t* mutex, const struct timespec* abstime);Поведение функции идентично варианту обычного ожидания, за исключением того, что ожидание может завершиться также при наступлении времени, переданного параметром
abstimeСледует помнить, что после наступления времени тайм-аута управление совсем не обязательно вернется к вызвавшему потоку. После наступления этого времени функция переведет поток из состояния блокирования на условной переменной в состояние готовности и предпримет попытку захвата мьютекса. Если мьютекс в это время захвачен другим потоком, вызвавший поток перейдет в состояние блокирования на мьютексе.
Возвращаемые значения:
EOK
EAGAIN
EFAULTcondmutex
EINVAL• не инициализированы переменные, на которые указывают
condmutex• попытка использования переменной, на которую указывает
cond• вызвавший поток не владеет указанным мьютексом.
ETIMEDOUTabstime.Выполнение условия
Штатным способом разблокирования потока, блокированного на условной переменной, является вызов функции, сигнализирующей о выполнении условия. В native API это функция
SyncCondvarSignal()pthread_cond_signal()pthread_cond_broadcast()Однако необходимо помнить про специфику ожидания внутри критической секции: вызов функции
pthread_cond_broadcast()Нештатным способом завершения ожидания на условной переменной может быть приход немаскированного сигнала UNIX. Если для данного сигнала определен обработчик, он выполнится без захвата мьютекса, а попытка захвата будет произведена уже после его завершения.
int pthread_cond_signal(pthread_cond_t* cond);Функция переводит в состояние готовности самый приоритетный поток из блокированных на условной переменной
condВозвращаемые значения:
EOK
EFAULTcondmutex
