Функции работы с «крутящейся» блокировкой объявлены в заголовочном файле <рthread.h>
Операции со спинлоком
Инициализация и разрушение спинлока
int pthread_spin_init(pthread_spinlock_t* spinner, int pshared);
Функция инициализирует объект синхронизации спинлока блокировки, на который указывает аргумент spinner
pshared. Эта переменная может принимать следующие значения:• PTHREAD_PROCESS_SHARED
• PTHREAD_PROCESS_PRIVATE
В случае успешного завершения функция возвращает нулевое значение, в противном случае — один из следующих кодов ошибок:
AGAIN
EBUSY
spinner, уже инициирован;EINVAL
spinner;ENOMEM
int pthread_spin_destroy(pthread_spinlock_t* spinner);
Функция деинициализирует объект крутящейся блокировки. После деинициализации для последующего применения объекта он должен быть вновь инициализирован. Обратите внимание, результат функции не определен, если поток в данный момент крутится на блокировке, на которую указывает spinner
spinner не был инициализирован.Возвращаемые значения:
EOK
EBUSY
EINVAL
spinner.Захват и освобождение спинлока
int pthread_spin_lock(pthread_spinlock_t* spinner);
int pthread_spin_trylock(pthread_spinlock_t* spinner);
Это функции захвата и попытки захвата крутящейся блокировки соответственно. Как и для мьютекса, если объект spinner
spinner уже захвачен другим потоком, то в случае вызова второй из рассматриваемых функций управление возвращается немедленно, а в случае простого захвата (первая функция) вызвавший поток «крутится», то есть остается активным, но не возвращает управления до тех пор, пока объект синхронизации не освободится.Попытка повторного захвата крутящейся блокировки из того же потока приводит к мертвой блокировке.
Функции возвращают следующие параметры:
EOK
EAGAIN
spinner;EDEADLK
spinner;EINVAL
spinner — неверный объект типа pthread_spinlock_t;EBUSY
pthread_spin_trylock()).int pthread_spin_unlock(pthread_spinlock_t* spinner);
Вызов этой функции освобождает объект крутящейся блокировки, на который указывает аргумент spinner
Функция может возвращать значения:
EOK
EINVAL
spinner;EPERM
5. Специфические механизмы QNX
Операционная система QNX изнутри вся построена на клиент-серверных принципах, которые вытекают из микроядерной архитектуры и обмена сообщениями микроядра. Мы не могли обойти вниманием эти механизмы, поскольку они предоставляют огромный арсенал возможностей, однако их обстоятельное описание потребовало бы отдельной книги (полное описание см. в технической документации QNX по системной архитектуре). Более того, лучшая книга по обмену сообщениями микроядра уже, пожалуй, написана и переведена на русский язык [1]. В дополнение ко всему приложение «Организация обмена сообщениями», написанное В. Зайцевым и ранее не публиковавшееся, содержит обстоятельный анализ этого механизма.
Поэтому в главе мы лишь кратко рассмотрим вопросы параллелизма и синхронизации, присущие самой микроядерной архитектуре системы.
Обмен сообщениями микроядра