Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform | страница 32



:

>#include

>int pthread_create(pthread_t *thread,

> const pthread_attr_t *attr,

> void*(*start_routine)(void*), void *arg);

Функция pthread_create() имеет четыре аргумента :

threadуказатель на >pthread_t, где хранится идентификатор потока
attrатрибутная запись
start_routineподпрограмма, с которой начинается поток
argпараметр, который передается подпрограмме start_routine

Отметим, что указатель thread и атрибутная запись (attr) — необязательные элементы, вы может передавать вместо них NULL.

Параметр thread может использоваться для хранения идентификатора вновь создаваемого потока. Обратите внимание, что в примерах, приведенных ниже, мы передадим NULL, обозначив этим, что мы не заботимся о том, какой идентификатор будет иметь вновь создаваемый поток.

Если бы нам было до этого дело, мы бы сделали так:

>pthread_t tid;

>pthread_create(&tid, ...

>printf("Новый поток имеет идентификатор %d\n", tid);

Такое применение совершенно типично, потому что вам часто может потребоваться знать, какой поток выполняет какой участок кода.

Небольшой тонкий момент. Новый поток может начать работать еще до присвоения значения параметру tid. Это означает, что вы должны внимательно относиться к использованию tid в качестве глобальной переменной. В примере, приведенном выше, все будет корректно, потому что вызов pthread_create() отработал до использования tid, что означает, что на момент использования tid имел корректное значение.

Новый поток начинает выполнение с функции start_routine(), с параметром arg.

Атрибутная запись потока

Когда вы осуществляете запуск нового потока, он может следовать ряду четко определенных установок по умолчанию, или же вы можете явно задать его характеристики.

Прежде, чем мы перейдем к обсуждению задания атрибутов потока, рассмотрим тип данных >pthread_attr_t:

>typedef struct {

> int flags;

> size_t   stacksize;

> void     *stackaddr;

> void     (*exitfunc)(void *status);

> int      policy;

> struct   sched_param param;

> unsigned guardsize;

>} pthread_attr_t;

В основном эти поля используются как:

flagsНеисчисляемые (булевы) характеристики потока — например, создается поток как «обособленный» или «синхронизирующий».
stacksize, stackaddr и guardsizeПараметры стека.
exitfuncФункция, выполняемая перед завершением потока.
policy и paramПараметры диспетчеризации.

Доступны следующие функции:

Управление атрибутами

pthread_attr_destroy()

pthread_attr_init()

Флаги (булевы характеристики)

pthread_attr_getdetachstate()