Библиотека сайта rus-linux.net
Цилюрик О.И. Linux-инструменты для Windows-программистов | ||
Назад | Библиотеки API POSIX | Вперед |
Параметры создания потока
Созданный поток может иметь много параметров,
определяющих его поведение. Эти параметры описываются в атрибутной
записи потока — параметр attr
(2-й) при создании потока. Если в качестве этого параметра
указывается NULL, то создаётся поток с параметрами по умолчанию.
Основные определения (константы) для таких параметров:
enum { /* Detach state. */ PTHREAD_CREATE_JOINABLE, PTHREAD_CREATE_DETACHED }; enum { /* Mutex protocols. */ PTHREAD_PRIO_NONE, PTHREAD_PRIO_INHERIT, PTHREAD_PRIO_PROTECT }; enum { /* Scheduler inheritance. */ PTHREAD_INHERIT_SCHED, PTHREAD_EXPLICIT_SCHED }; enum { /* Scope handling. */ PTHREAD_SCOPE_SYSTEM, PTHREAD_SCOPE_PROCESS };
Параметры определяются в структуре типа pthread_attr_t
.
В Linux этот тип определён в </usr/include/bits/pthreadtypes.h>
,
примерно так:
#define __SIZEOF_PTHREAD_ATTR_T 36 typedef union { char __size[__SIZEOF_PTHREAD_ATTR_T]; long int __align; } pthread_attr_t;
Непосредственно с работа не производится, есть множество API для установки и чтения разных параметров из атрибутной записи потока.
При создании дефаултной атрибутной записи потока (PTHREAD_JOINABLE,
SCHED_OTHER, ...
) она должна быть инициализирована:
int pthread_attr_init( pthread_attr_t *attr );
После старта потока атрибутная запись уже не нужна и может быть переинициализирована (если предполагается ещё инициировать потоки), или должна быть уничтожена:
int pthread_attr_destroy( pthread_attr_t *attr ) ;
После создания атрибутной записи потока к ней
применяются множество функций, подготавливающих нужный набор
параметров атрибутов запуска, функции вида pthread_attr_*()
,
смысл большинства из них понятен без комментариев:
int pthread_attr_getschedparam( const pthread_attr_t *attr, struct sched_param *param) ; int pthread_attr_setschedparam( pthread_attr_t *attr, const struct sched_param *param); int pthread_attr_getschedpolicy( const pthread_attr_t *attr, int *policy ); int pthread_attr_setschedpolicy( pthread_attr_t *attr, int policy ); ... int pthread_attr_setaffinity_np( pthread_attr_t *attr, size_t cpusetsize, const cpu_set_t *cpuset ) ; int pthread_attr_getaffinity_np( const pthread_attr_t *attr, size_t cpusetsize, cpu_set_t *cpuset ) ; ... int pthread_attr_getdetachstate( const pthread_attr_t *attr, int *detachstate ); int pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate) ;
int pthread_attr_getguardsize( const pthread_attr_t *attr, size_t *guardsize );
- получить размер охранной области, создаваемой для защиты от переполнения стека.
extern int pthread_attr_setguardsize( pthread_attr_t *attr, size_t guardsize) ;
- установить размер охранной области, создаваемой для защиты от переполнения стека.
int pthread_attr_getinheritsched( const pthread_attr_t *attr, int *inherit );
- получить характер наследования (PTHREAD_INHERIT_SCHED, PTHREAD_EXPLICIT_SCHED
) параметров для потока.
int pthread_attr_setinheritsched( pthread_attr_t attr, int inherit );
- установить характер наследования (PTHREAD_INHERIT_SCHED, PTHREAD_EXPLICIT_SCHED ) параметров для потока.
int pthread_attr_getscope( const pthread_attr_t *attr, int *scope );
- получить область деспетчирования для потока (PTHREAD_SCOPE_SYSTEM, PTHREAD_SCOPE_PROCESS );
int pthread_attr_setscope( pthread_attr_t *attr, int scope) ;
- установить область деспетчирования для потока (PTHREAD_SCOPE_SYSTEM, PTHREAD_SCOPE_PROCESS );
int pthread_attr_getstackaddr( const pthread_attr_t *attr, void **stackaddr ) ;
- получить адрес, ранее установленный для стека;
int pthread_attr_setstackaddr( pthread_attr_t *attr, void *stackaddr ) ;
- установить адрес стека, минимальный размер кадра стека PTHREAD_STACK_MIN
;
int pthread_attr_getstacksize( const pthread_attr_t *attr, size_t *stacksize ) ;
- получить текущий установленный минимальный размер стека;
int pthread_attr_setstacksize( pthread_attr_t *attr, size_t __stacksize)
- добавить информацию о минимальном стеке, необходимом для старта
потока; этот размер не может быть менее PTHREAD_STACK_MIN
,
и не должен превосходить установленные в системе пределы;
int pthread_getattr_np( pthread_t th, pthread_attr_t *attr );
- инициализировать атрибутную запись нового потока в соответствии с атрибутной записью ранее существующего;
Поток, созданный как присоединённый (по умолчанию это так), может быть позже отсоединён вызовом:
int pthread_detach( pthread_t th );
Но переведен обратно в состояние присоединённости
(PTHREAD_JOINABLE
) он более быть не может.
Предыдущий раздел: | Оглавление | Следующий раздел: |
Создание потока | Временные затраты на создание потока |