• при работе с
• дочерние процессы, созданные
Выбор между семействами функций
Запуск потока
Теперь, когда мы знаем, как запустить другой процесс, давайте рассмотрим, как осуществить запуск другого потока.
Любой поток может создать другой поток в том же самом процессе; на это не налагается никаких ограничений (за исключением объема памяти, конечно!) Наиболее общий путь реализации этого — использование вызова функций POSIX
#include
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void*(*start_routine)(void*), void *arg);
Функция
указатель на pthread_t , где хранится идентификатор потока | |
атрибутная запись | |
подпрограмма, с которой начинается поток | |
параметр, который передается подпрограмме |
Отметим, что указатель
Параметр
Если бы нам было до этого дело, мы бы сделали так:
pthread_t tid;
pthread_create(&tid, ...
printf("Новый поток имеет идентификатор %d\n", tid);
Такое применение совершенно типично, потому что вам часто может потребоваться знать, какой поток выполняет какой участок кода.
Новый поток начинает выполнение с функции
Когда вы осуществляете запуск нового потока, он может следовать ряду четко определенных установок по умолчанию, или же вы можете явно задать его характеристики.
Прежде, чем мы перейдем к обсуждению задания атрибутов потока, рассмотрим тип данных 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;
В основном эти поля используются как:
Неисчисляемые (булевы) характеристики потока — например, создается поток как «обособленный» или «синхронизирующий». | |
Параметры стека. | |
Функция, выполняемая перед завершением потока. | |
Параметры диспетчеризации. |
Доступны следующие функции:
Управление атрибутами