Структура, характеризующая атрибуты создаваемого потока
#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 системной библиотеки