Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. 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) он более быть не может.


Предыдущий раздел: Оглавление Следующий раздел:
Создание потока   Временные затраты на создание потока