Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

СРВ_08_18_01_Потоки

.pptx
Скачиваний:
5
Добавлен:
20.06.2023
Размер:
51.59 Кб
Скачать

Выполняемая

программа

main () { ….

pthread_create(…) ….

}

ТСВ

Стек

Потоки

Программа

ТСВ

Стек

8. «Легковесные процессы» - потоки (нити)

#include <pthread.h>

int pthread_create( pthread_t* thread, const pthread_attr_t* attr,

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

thread – идентификатор нити (ID), устанавливается при создании;

attr (ТСВ)– атрибутная запись, при значении NULL устанавливается по умолчанию;

void* (*start_routine)(void* ) – функция, код которой выполняется в потоке;

arg – аргумент, передаваемый в функцию потока

Простой вызов - pthread_create(&t, NULL, &func, NULL)

Идентификатор(ID)

процесса

pid_t getpid()

Идентификатор(ID)

потока

pthread_t pthread_self()

8. Потоки

2015 v.01

1

Многозадачность

 

 

 

 

 

 

 

 

 

 

Вектор прерывания

 

 

 

 

 

 

 

 

 

 

 

 

события T

 

 

 

 

Поток А

 

 

 

 

 

 

 

Адрес d

 

 

 

 

x0:

 

 

 

 

 

Указатель стека (SP)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Диспетчер

 

 

 

 

 

Событие T1

 

 

 

 

 

Адрес Стека

 

 

 

 

 

d:

 

 

 

 

Поток B

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y0:

Системный

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

стек

 

 

Событие T2

 

 

 

d:

 

 

 

 

 

 

 

 

x1:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Стек

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

t

Событие T3

 

 

 

d:

 

 

 

 

 

 

потока А

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y1:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Стек

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

потока В

 

 

d: «точка входа» диспетчера

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8. Потоки

2015 v.01

2

Пример

#include <cstdlib> #include <iostream> #include <pthread.h> #include <unistd.h>

void* thread_0 (void* args){ for(int i=1; i<=3; i++){

pthread_t t = pthread_self();

std::cout << "********** ID " << t << std::endl; sleep (2);

}

return EXIT_SUCCESS;

}

int main() {

pthread_t thread_id;

pthread_create(&thread_id, NULL, &thread_0, NULL); pthread_join(thread_id, NULL);

std::cout << “QNX first thread finished" << std::endl;

return EXIT_SUCCESS;

}

8. Потоки

2015 v.01

3

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

(Task Control Block)

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

адрес стека

(*exitfunc)(void *status)

функция, выполняемая перед

 

завершением потока

рolicy

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

struct sched_param param

параметры диспетчеризации

guardsize

размер «области защиты»

«Вручную» не изменяются !

8. Потоки

2015 v.01

4