Структура, характеризующая атрибуты создаваемого потока
#include <sys/neutrino.h>
struct _thread_attr {
int __flags;
size_t __stacksize;
void *__stackaddr;
void (*__exitfunc)( void *__status );
int __policy;
struct sched_param __param;
unsigned __guardsize;
unsigned __prealloc;
int __spare[2];
}
Тип позволяет модифицировать атрибуты создаваемого потока. Структура включает следующие поля:
- __flags
- Флаги потока. По умолчанию флаг установлен в ноль. В параметре flags может использоваться комбинация следующих флагов:
- PTHREAD_CREATE_JOINABLE (default)
- Перевести поток в состояние зомби при его завершении. Поток остаётся в этом состоянии пока не будет прочитан его код завершения или поток не будет отсоединён.
- PTHREAD_CREATE_DETACHED
- Создать обособленный поток; он не становится зомби. Вы не можете вызвать ThreadJoin() для обособленного потока.
- PTHREAD_INHERIT_SCHED (default)
- Наследовать атрибуты планирования создаваемого потока для нового потока.
- PTHREAD_EXPLICIT_SCHED
- Применить атрибуты и параметры планирования для нового потока из policy и param членов attr соответственно.
- PTHREAD_SCOPE_SYSTEM (default)
- Поток имеет масштаб системы.
- PTHREAD_SCOPE_PROCESS
- Не используйте этот флаг; ЗОСРВ «Нейтрино» реализует истинные потоки микроядра, которые имеют только системный масштаб.
- PTHREAD_MULTISIG_ALLOW (default)
- Если поток завершается из-за незаблокированного, необработанного сигнала, то завершить все потоки и, следовательно, процесс.
- PTHREAD_MULTISIG_DISALLOW
- Завершить только этот поток; все остальные потоки останутся незатронутыми.
- PTHREAD_CANCEL_DEFERRED (default)
- Завершение потока может произойти только в точках завершения, что описано в ThreadCancel().
- PTHREAD_CANCEL_ASYNCHRONOUS
- Каждая инструкция, исполненная потоком, рассматривается как точка завершения. POSIX и библиотека C не являются безопасными с точки зрения асинхронного завершения потоков.
- __stacksize
- Размер области стека потока определяемой stackaddr. Если stackaddr равен
NULL, то stacksize определяет размер динамически выделяемого стека. Если stacksize равен нулю, то 4096 байт предполагается. Минимально допустимое значение stacksize определяется PTHREAD_STACK_MIN. - __stackaddr
-
NULL или адрес стека, который вы хотите использовать в потоке. Установите stacksize размер стека. Если вы предоставляете ненулевой stackaddr, то вы обязаны освободить эту область памяти после завершения потока. Если stackaddr равен NULL, тогда ядро динамически выделяет стек при создании потока и автоматически освобождает стек при завершении потока. - void (*__exitfunc)( void *status )
- Адрес возврата, если функция потока поддерживает возврат.
 | Поток возвращается к exitfunc. Это означает, что переменная статуса не передаётся, как обычный параметр. Вместо этого она появляется в регистре возврата, продиктованной соглашением о вызове ЦП (например EAX на x86, R3 на PPC, V0 на MIPS, и т. д.). Функция exitfunc обычно должна иметь компиляторно- и процессорно-специфичную обработку доступа к данным status (извлекая их из регистра возврата в соответствующую локальную переменную). В качестве альтернативы вы можете написать функцию exitfunc на ассемблере для каждого ЦП. |
- __policy
- Дисциплина планирования, определённая в SchedSet() вызове ядра. Этот член используется только если вы установили флаг
PTHREAD_EXPLICIT_SCHED. Если вы хотите, чтобы поток наследовал дисциплину, но хотите задать параметры планирования в param, то установите флаг PTHREAD_EXPLICIT_SCHED и установите в policy значение SCHED_NOCHANGE. - __param
- Структура struct sched_param, задающая параметры планирования, определённые в SchedSet() вызове ядра. Этот член используется только при установке флага
PTHREAD_EXPLICIT_SCHED
ЗОСРВ «Нейтрино»
struct sched_param, SchedSet(), ThreadCreate(), ThreadCreate_r()
Предыдущий раздел: Описание API системной библиотеки