Структура, характеризующая атрибуты пула потоков
#include <sys/dispatch.h>
typedef struct _thread_pool_attr {
THREAD_POOL_HANDLE_T *handle;
THREAD_POOL_PARAM_T *(*block_func)( THREAD_POOL_PARAM_T *ctp );
void (*unblock_func)( THREAD_POOL_PARAM_T *ctp );
int (*handler_func)( THREAD_POOL_PARAM_T *ctp );
THREAD_POOL_PARAM_T *(*context_alloc)( THREAD_POOL_HANDLE_T *handle );
void (*context_free)( THREAD_POOL_PARAM_T *ctp );
pthread_attr_t *attr;
unsigned short lo_water;
unsigned short increment;
unsigned short hi_water;
unsigned short maximum;
const char *tid_name;
unsigned reserved[7];
} thread_pool_attr_t;
Тип позволяет определить атрибуты пула потоков, включая:
- функции, вызываемые для выделения и освобождения контекстов потоков, когда поток стартует или умирает.
- функции блокировки и обработки
- параметры пула потоков, например количество одновременно работяющих потоков.
Структура включает следующие поля:
- handle
- Дескриптор, передающийся в функцию context_alloc.
- block_func
- Функция, которая вызывается когда рабочий поток переходит в заблокированное состояние, ожидая работы. Эта функция возвращает указатель, который передаётся в handler_func.
- unblock_func
- Функция, которая вызывается для разблокирования потоков. Если вы используете dispatch_block() в качестве block_func, то используйте dispatch_unblock() в качестве unblock_func.
- handler_func
- Функция, вызываемая после возврата из block_func, выполняющая некоторую работу. Функция передаётся как указатель, возвращаемый block_func.
- context_alloc
- Функция, вызываемая при создании нового потока пулом потоков. Получает handle. Функция возвращает указатель, который затем передаётся в block_func.
- context_free
- Функция, вызываемая при завершении рабочего потока для освобождения контекста, выделенного context_alloc.
- attr
- Указатель на функцию pthread_attr_*(), который передаётся в pthread_create(). Функция pthread_attr_*() задаёт размер стека, приоритет и прочие параметры рабочих потоков. Если
NULL
, то используются значения по умолчанию. - lo_water
- Минимальное количество потоков, которое пул должен держать в заблокированном состоянии (т.е. потоки, готовые выполнять работу).
- increment
- Количество потоков, создаваемых за один раз.
- hi_water
- Максимальное количество потоков, которое пул должен держать в заблокированном состоянии.
- maximum
- Наибольшее количество потоков, которое может создать пул.
- tid_name
-
NULL
или указатель на нуль-терминированную строку имени потоков в пуле. Если задано, то эта строка передаётся в pthread_setname_np(), когда пул создаёт новый поток.
 | Область видимости строки tid_name должна совпадать с временем жизни пула потоков. Следующий пример корректен: pool_attr.tid_name = "fsys_resmgr";
но использование локальной или автоматической переменной, как показано ниже, некорректно: { char name[32]; snprintf( name, sizeof( name ), "cam %d:%d", cam.path, cam.target ); pool_attr.tid_name = name; ... return; }
|
ЗОСРВ «Нейтрино»
thread_pool_control(), thread_pool_create()
Предыдущий раздел: Описание API системной библиотеки