Библиотека сайта 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) он более быть не может.
| Предыдущий раздел: | Оглавление | Следующий раздел: |
| Создание потока | Временные затраты на создание потока |
