Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
Шрифт:
В основном эти поля используются как:
flags | Неисчисляемые (булевы) характеристики потока — например, создается поток как «обособленный»
|
stacksize, stackaddr и guardsize | Параметры стека. |
exitfunc | Функция, выполняемая перед завершением потока. |
policy и param | Параметры диспетчеризации. |
Доступны следующие функции:
Управление атрибутами
pthread_attr_destroy
pthread_attr_init
Флаги (булевы характеристики)
pthread_attr_getdetachstate
pthread_attr_setdetachstate
pthread_attr_getinheritsched
pthread_attr_setinheritsched
pthread_attr_getscope
pthread_attr_setscope
Параметры стека
pthread_attr_getguardsize
pthread_attr_setguardsize
pthread_attr_getstackaddr
pthread_attr_setstackaddr
pthread_attr_getstacksize
pthread_attr_setstacksize
Параметры диспетчеризации
pthread_attr_getschedparam
pthread_attr_setschedparam
pthread_attr_getschedpolicy
pthread_attr_setschedpolicy
Список выглядит довольно большим (18 функций), но в действительности нас будет заботить применение только примерно половины функций из этого списка, потому что все эти они сгруппированы по парам «get» — «set», т.е. в каждой паре есть функция как получения параметров (get), так и их установки (set) — за исключением функций pthread_attr_init и pthread_attr_destroy.
Прежде чем мы исследуем назначения атрибутов, следует отметить одно обстоятельство. Вы обязаны вызвать pthread_attr_init для инициализации атрибутной записи до момента ее использования, задействовать ее с помощью соответствующей функции (функций) pthread_attr_set* и только затем вызвать функцию pthread_create для создания потока. Изменение атрибутной записи после того, как поток уже создан, не будет иметь никакого действия.
Перед использованием атрибутной записи для ее инициализации следует вызвать функцию pthread_attr_init:
Вы
В приведенных ниже описаниях значения по умолчанию помечены комментарием «(по умолчанию)».
Три функции — pthread_attr_setdetachstate, pthread_attr_setinheritsched и pthread_attr_setscope — определяют, создается ли поток как «синхронизирующий» («joinable») или как «обособленный» (detached), наследует ли поток атрибуты диспетчеризации от создающего потока или использует атрибуты диспетчеризации, указанные в функциях pthread_attr_setschedparam и pthread_attr_setschedpolicy, и, наконец, имеет ли поток масштаб «системы» или «процесса».
Для создания «синхронизирующего» потока (это значит, что с завершением этого потока можно синхронизировать другой поток при помощи функции pthread_join), используется вызов:
(по умолчанию)
Чтобы создать поток, синхронизация с завершением которого невозможна (такой поток называют «обособленным»), надо было бы сделать так:
Если вы желаете, чтобы поток унаследовал атрибуты диспетчеризации от потока, его создающего (то есть имел бы ту же самую дисциплину диспетчеризации и тот же самый приоритет, что и родитель), вам следует сделать так:
(по умолчанию)
Для создания потока, который использует атрибуты диспетчеризации, указанные в непосредственно в атрибутной записи (это делается при помощи функций pthread_attr_setsetschedparam и pthread_attr_setschedpolicy), вызов выглядел бы следующим образом:
И наконец, функция pthread_attr_setscope. Вам не придется ее вызывать никогда. Почему? Потому что QNX/Neutrino поддерживает для потоков только масштаб системы, и соответствующее значение устанавливается по умолчанию, когда вы инициализируете атрибут. (Масштаб системы означает, что за обладание ресурсами все потоки в системе конкурируют друг с другом; масштаб процесса же означает, что потоки конкурируют за процессор только в пределах «своего» процесса, а диспетчеризацию процессов выполняет ядро).
Если вам необходимо вызвать эту функцию, вы можете сделать это только следующим образом:
(по умолчанию)
Прототипы функций установки параметров стека в атрибутах потока выглядят следующим образом: