Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform | страница 34
> PTHREAD_CREATE_JOINABLE);
Чтобы создать поток, синхронизация с завершением которого невозможна (такой поток называют «обособленным»), надо было бы сделать так:
>pthread_attr_setdetachstate(&attr,
> PTHREAD_CREATE_DETACHED);
Если вы желаете, чтобы поток унаследовал атрибуты диспетчеризации от потока, его создающего (то есть имел бы ту же самую дисциплину диспетчеризации и тот же самый приоритет, что и родитель), вам следует сделать так:
(по умолчанию)
>pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED);
Для создания потока, который использует атрибуты диспетчеризации, указанные в непосредственно в атрибутной записи (это делается при помощи функций pthread_attr_setsetschedparam() и pthread_attr_setschedpolicy()), вызов выглядел бы следующим образом:
>pthread_attr_setinheritsched(&attr,
> PTHREAD_EXPLICIT_SCHED);
И наконец, функция pthread_attr_setscope(). Вам не придется ее вызывать никогда. Почему? Потому что QNX/Neutrino поддерживает для потоков только масштаб системы, и соответствующее значение устанавливается по умолчанию, когда вы инициализируете атрибут. (Масштаб системы означает, что за обладание ресурсами все потоки в системе конкурируют друг с другом; масштаб процесса же означает, что потоки конкурируют за процессор только в пределах «своего» процесса, а диспетчеризацию процессов выполняет ядро).
Если вам необходимо вызвать эту функцию, вы можете сделать это только следующим образом:
(по умолчанию)
>pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
Прототипы функций установки параметров стека в атрибутах потока выглядят следующим образом:
>int pthread_attr_setguardsize(pthread_attr_t *attr,
> size_t gsize);
>int pthread_attr_setstackaddr(pthread_attr_t *attr,
> void *addr);
>int pthread_attr_setstacksize(pthread_attr_t *attr,
> size_t ssize);
Все эти три функции имеют в качестве первого параметра атрибутную запись, вторые параметры перечислены ниже:
gsize | Размер «области защиты». |
addr | Адрес стека, если последний вами предусмотрен. |
ssize | Размер стека. |
Область защиты — это область памяти, расположенная сразу после стека, которую поток не может использовать для записи. Если это происходит (а это означает, что стек вот-вот переполнится), потоку будет послан SIGSEGV. Если размер области защиты равен 0, это означает, что области защиты не предусматривается. Это также подразумевает, что проверка стека на переполнение выполняться не будет. Если размер области защиты отличен от нуля, то это устанавливает его по меньшей мере в общесистемное значение по умолчанию (которое вы можете получить по запросу