ThreadCreate(), ThreadCreate_r()

Создать поток

Прототип:

#include <sys/neutrino.h>
int ThreadCreate( pid_t pid,
void * (func)( void * ),
void *arg,
const struct _thread_attr *attr );
int ThreadCreate_r( pid_t pid,
void * (func)( void * ),
void *arg,
const struct _thread_attr *attr );

Аргументы:

pid
Идентификатор процесса, в котором нужно создать поток или 0 для создания потока в текущем процессе.
func
Указатель на функцию, которую поток должен выполнять. Аргументarg, передаваемый в ThreadCreate(), передаётся в func() как её единственный аргумент. Возврат из func() происходит к адресу, определяемому exitfunc в структуре attr.
arg
Указатель на любые данные, передаваемые функции func.
attr
Указатель на структуру struct _thread_attr, которая определяет атрибуты нового потока или NULL, если необходимо использовать атрибуты по умолчанию. Подробнее - в thread attributes structure.

Note: Если изменить атрибуты после создания потока, то атрибуты потока не изменятся.

Библиотека:

libc

Описание:

Эти вызовы ядра создают новый поток с атрибутами, определяемыми attr, внутри процесса, определяемого по pid. Если pid равен нулю, используется текущий процесс.


Note: Только менеджер процессов может создавать потоки в других процессах.

Функции ThreadCreate() и ThreadCreate_r() идентичны, за исключением способа сообщения об ошибках.


Note: Вместо использования вызовов ядра напрямую используйте pthread_create().

Новый поток разделяет все ресурсы процесса, в котором он создан. Что включает память, таймеры, каналы и соединения. Стандартная библиотека C содержит мьютексы, чтобы сделать эти сущности потокобезопасными.

Состояние сигналов

Состояние сигналов нового потока инициализируется следующим образом:

Локальное хранилище приватных данных

Каждый поток содержит локальную область потока для хранения своих приватных данных. Можно получить указатель на эту область при помощи __tls() (определён в <sys/storage.h>).

Локальное хранилище потока определно в struct _thread_local_storage.

Состояния блокировки:

Эти вызовы не блокируют.

Возвращаемое значение:

ThreadCreate()
Идентификатор созданного потока. Если возникла ошибка функция возвращает -1, код ошибки записывается в errno.
ThreadCreate_r()
Идентификатор созданного потока. Функция НЕ устанавливает errno. При возникновении ошибки функция возвращает один из представленных ниже кодов с отрицательным знаком.

Коды ошибок:

EAGAIN
Все объекты потоков ядра заняты.
EFAULT
Произошла ошибка при обращении ядра к буферам.
EINVAL
Некорректная дисциплина планирования или приоритет.
ENOTSUP
Был запрошен PTHREAD_SCOPE_PROCESS. Все потоки ядра являются PTHREAD_SCOPE_SYSTEM.
EPERM
Вызывающий поток не имеет достаточно прав для создания потоков в другом процессе. Только поток с идентификатором процесса, равным 1, может создавать потоки в других процессах.
ESRCH
Процесс с таким pid не существует.

Классификация:

ЗОСРВ «Нейтрино»

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Предостережения:

Интерпретация PTHREAD_STACK_MIN в ЗОСРВ «Нейтрино» - это достаточное количество памяти, чтобы запустить пустой поток:

void nothingthread( void )
{
return;
}

Тематические ссылки:

struct sched_param, struct _thread_attr, struct _thread_local_storage, __tls(), pthread_create(), SchedSet(), ThreadCancel(), ThreadDestroy()




Предыдущий раздел: Описание API системной библиотеки