Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
vovk.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
456 Кб
Скачать
☆

18. Створення потоків в ос qnx-6

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

К потокам можно применять такие методы синхронизации:

Любой поток может создать новый поток в том же самом процессе по средствам ф-ции pthread_create, которая имеет следующее описание:

<pthread.h>

int pthread_create(pthread_t*tid, \\ указатель на структуру pthread_t в котором хранится идентификатор потока )

const pthread_attr_t*attr, \\указатель на атрибутную запись

void*(*subroutine) (void*), \\subroutine- имя ф-ции с которой начинается поток

void*arg; arg-параметр который передается ф-ции subroutine.

При вызове ф-ции pthread обязательным является только имя ф-ции которое загружает поток.

Pthread_create (NULL, NULL, my_thread, NULL);

Запуск потока my_thread, его тип не будет использоваться в программе.

Void*my_thread (void*a) {\\что-то}

Если необходимо запомнить идентификатор потока

pthread_t tid;

pthread_create (& tid,…)

19. Копіювання процесів в ос qnx-6

В QNX-6 допускается копирование процесса, если он однопотоковый, для этого следует использовать ф-цию fork(). После выполнения этой ф-ции будет создан идентичный работающему процессу процесс, который будет иметь свой pid. Различить два процесса из программы можно путем анализа значения их идентификатора.

#include<estedio.h>

int main()

{int red value; \\для возвращаемого значения

red value= fork();

ptintf(“it is me / n”);

return0; }

it is me

it is me

Для того чтобы различить два одинаковых процесса надо использовать следующее red value = 0 в новом процессе, а в старом процессе ему будет присвоен pid нового процесса.

If(redval=fork())

{printf(“it is me”);

printf(“I am parent”); }

else {printf(“it is me”);

printf(“I am child”); }}

20. Атрибути потоків в ос qnx-6.

Структура типа данных pthread_attr_t содержит в себе информацию про атрибуты потока, который мы создаем при помощи функции pthread_create.

Данная структура имеет вид:

typedef struct {

int flags;

size_t stacksize;

void * stackaddr;

void (*exitfunc)(void * status);

int policy;

struct sched_param param;

unsigned quardsize;

} pthread_attr_t;

Рассмотрим поля:

flags – определяет хар-ки потока (поток создан по присоединению, или как обособленный)

stacksize, stackaddr, quardsize – параметры стека.

policy, param – параметры диспетчирезации.

Существует 18 фукций для установки атрибутов потока:

- общие

pthread_attr_init() – инициализация атрибутной записи;

pthread_attr_destroy() – разрушение …

- для флагов

Присоединенный поток:

pthread_attr_getdetachstate()

pthread_attr_setdetachstate()

Обособленный поток:

pthread_attr_getinheritsched()

pthread_attr_setinheritsched()

pthread_attr_getscope()

pthread_attr_setscope() – с помощью этой функции мы можем устанавлевать масштаб работы потока(масштаб системы или масштаб процесса, QNX6 поддерживает только масштаб системы)

-для стека

pthread_attr_getstackaddr()

pthread_attr_setstackaddr()

pthread_attr_getguardsize()

pthread_attr_setguardsize()

pthread_attr_getstacksize()

pthread_attr_setstacksize()

-для диспетчирезации

pthread_attr_getschedparam()

pthread_attr_setschedparam()

pthread_attr_getschedpolicy()

pthread_attr_setschedpolicy()

Перед созданием потока мы можем выполнить изменение в структуре атрибутов создаваемого потока. Для этого мы сначала должны выполнить инициализацию структуры атрибутов, а потом создать поток.

Атрибут флаг позволяет изменять характеристики потока, а именно: поток будет обособленный или присоединенный, наследует ли он атрибуты диспетчирезации от родителя или они другие, какой масштаб имеет поток(системы или процесса).

Поток может создаваться как ожидаемый (PTHREAD_CREATE_JOINABLE, и таковым

он создаётся по умолчанию, используется также термин “присоединённый”) или

отсоединённый (PTHREAD_CREATE_DETACHED). Например:

pthread_attr_t attr;

pthread_attr_init( &attr );

pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED );

pthread_create( NULL, &attr, &function, NULL );

Присоединённый поток может позже быть ожидаемый по завершению другим

потоком, выполняющим вызов:

int pthread_join( pthread_t thread, void** value_ptr );

где:

thread – идентификатор TID ожидаемого потока, который заполняется как первый

параметр вызова pthread_create( pthread_t* thread, ... ) при его создании,

или может быть получен позже вызовом pthread_self();

value_ptr - NULL, или указатель на локализацию значения, возвращаемого

потоковой функцией (оператором return или вызовом pthread_exit());

Пожалуй, наиболее часто приходится переопределять именно приоритет, с которым

будет выполняться создаваемый поток. При запуске потока с параметрами по

умолчанию, его приоритет устанавливается равным приоритету порождающего

потока. Значение приоритета создаваемого потока хранится в поле param атрибутной

записи (типа sched_param, обсуждение этой структуры см. ниже, при обсуждении

диспетчеризации), как и следует из этого, для переустановки этого поля

предоставлена функция:

int pthread_attr_setschedparam( pthread_attr_t *attr, const struct sched_param *param );

где:

attr – как и ранее, атрибутная запись потока;

param – указатель структуры sched_param, из которой параметры будут перенесены

в атрибутную запись потока;

Посмотрим, как запустить на выполнение поток с приоритетом на 2 единицы ниже,

чем у его родителя:

int policy;

struct sched_param param;

pthread_getschedparam( pthread_self(), &policy, &param );

param.sched_priority –= 2;

pthread_attr_t attr;

pthread_attr_init( &attr );

pthread_attr_setschedparam( &attr, &param );

pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );

pthread_create( NULL, &attr, &func, NULL );

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]