СРВ_08_18_01_Потоки
.pptxВыполняемая
программа
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 |