В стандарте библиотек нитей POSIX реализация некоторых компонентов объявлена необязательной. Все функции, определенные с помощью API библиотеки нитей, доступны всегда. Некоторые функции могут быть не реализованы. Приложения могут вызывать нереализованные функции, но те всегда будут возвращать код ошибки ENOSYS.
Следующие разделы посвящены необязательным компонентам библиотеки работы с нитями:
Определены следующие необязательные компоненты:
Для применения функции наследования приоритета и защиты приоритета необходима функция планирования приоритета.
С помощью адреса стека можно изменять значение атрибута stackaddr в объекте атрибутов нити. Этот атрибут указывает размещение памяти, отведенной под стек для вновь созданной нити. Дополнительная информация об атрибуте stackaddr приведена в разделе "Адрес стека.
Если этот необязательный компонент реализован, то доступны следующие атрибуты и функции:
С помощью размера стека можно изменять значение атрибута stacksize в объекте атрибутов нити. Этот атрибут указывает минимальный размер области памяти, отведенной под стек для вновь созданной нити. Дополнительная информация об атрибуте stacksize приведена в разделе "Размер стека.
Если этот необязательный компонент реализован, то доступны следующие атрибуты и функции:
Планирование приоритета позволяет управлять планированием нитей. Если эта функция отключена, то параметры планирования всех нитей в процессе наследуются от самого процесса. Если же она включена, то каждая нить имеет свой набор параметров планирования. Для нитей с локальной областью действия с параметрами планирования работает планировщик библиотеки на уровне процесса, в то время как параметры планирования нитей с глобальной областью действия обрабатывает планировщик ядра на системном уровне. Более подробная информация об атрибутах планирования приведена в разделе Планирование работы нитей.
Если этот необязательный компонент реализован, то доступны следующие атрибуты и функции:
Проверить наличие необязательных компонентов можно как на этапе компиляции (Проверка наличия во время компиляции), так и на этапе выполнения (Проверка наличия во время выполнения). Переносимые программы должны проверять наличие необязательных компонентов до начала работы с ними, чтобы не приходилось изменять исходный код программ при переносе в другую систему.
Для проверки наличия необязательных компонентов в системе на этапе компиляции программы можно применять символьные константы (символы). Эти символы определены в файле заголовка pthread.h директивой препроцессора #define. Символы, соответствующие нереализованным компонентам, директива препроцессора #undef объявляет неопределенными. Проверка символов наличия компонентов должна выполняться в каждой программе, обладающей свойством переносимости.
Ниже приведен список всех
символов, соответствующих необязательным компонентам:
Если окажется, что какой-либо необязательный компонент недоступен, то компиляцию можно прервать так:
#ifndef _POSIX_THREAD_ATTR_STACKSIZE #error "Необходимо наличие компонента POSIX - Размер стека" #endif
В файле заголовков
pthread.h определяются также символы, которые могут
применяться другими файлами заголовков или программами. Эти символы
перечислены ниже:
_POSIX_REENTRANT_FUNCTIONS | Означает, что необходимы реентерабельные функции. |
_POSIX_THREADS | Означает реализацию библиотеки нитей. |
Для проверки наличия необязательных компонентов в системе на этапе выполнения программы можно применять функцию sysconf. Она оказывается весьма полезной при переносе программ в двоично-совместимую систему, например, в систему под управлением другой версии AIX.
Ниже приведен список символьных
констант, связанных со всеми необязательными компонентами. Эти
символьные константы необходимо передать в функцию sysconf в
параметре Name. Константы определены в файле заголовка
unistd.h.
Кроме того, можно проверить
наличие двух основных компонентов, вызвав функцию sysconf со
следующими значениями параметра имя:
_SC_REENTRANT_FUNCTIONS | Означает, что необходимы реентерабельные функции. |
_SC_THREADS | Означает реализацию библиотеки нитей. |
Глава 11, Создание программ с нитями.
Краткая справка по библиотеке работы с нитями.