Чтение онлайн

на главную

Жанры

QNX/UNIX: Анатомия параллелизма
Шрифт:

Функциональные параметры пула определяют:

context_alloc
и
context_free
— функции создания и уничтожения контекста потока, которые вызываются при создании и уничтожении каждого потока пула. Функция создания контекста потока ответственна за индивидуальные настройки создаваемого потока. Она возвращает «указатель на контекст» типа
THREAD_POOL_PARAM_T
. Однако системе такой тип неизвестен:

#ifndef THREAD_POOL_PARAM_T

#define THREAD_POOL_PARAM_T void

#endif

В качестве

контекста может использоваться любой пользовательский тип, и он будет передаваться последовательно в качестве параметра (
ctp
) во все последующие функции обслуживания потока.

block_func
— функция блокирования, которая вызывается в потоке сразу же после
context_alloc
или после очередного этапа выполнения потоком функции обработчика
handler_func
. Функция блокирования получает и возвращает далее обработчику (возможно, после модификации) структуру контекста (в приведенном выше примере контекстом является
int
— значение присоединенного TCP-сокета).

handler_func
— это, собственно, и есть аналог потоковой функции, в которой выполняется вся полезная работа потока. Функция вызывается библиотекой после выхода потока из блокирующей функции
block_func
, при этом функция-обработчик
handler_func
получит параметр контекста, возвращенный
block_func
.

Примечание

В текущей реализации

handler_func
должна возвращать 0; все другие значения зарезервированы для дальнейших расширений. Аналогично определенная в атрибутной записи функция
unblock_func
зарезервирована для дальнейших расширений, и вместо ее адреса следует устанавливать
NULL
.

2. После создания атрибутной записи пула, определяющей всю функциональность его дальнейшего поведения, можно приступать к непосредственному созданию пула потоков:

thread_pool_t* thread_pool_create(

thread_pool_attr_t* attr, unsigned flags);

где

attr
подробно рассмотренная (и созданная) ранее атрибутная запись пула;

flags
— флаг, определяющий поведение вызывающего потока после последующего вызова
thread_pool_start
. В документации описано два возможных значения флага:

POOL_FLAG_EXIT_SELF
— после старта пула поток, вызвавший
thread_pool_start
(часто это главный поток приложения), завершается;

POOL_FLAG_USE_SELF
— после старта пула поток, вызвавший
thread_pool_start
, включается в пул в качестве одного из его потоков.

И в том и в другом случае в типовом фрагменте (как и в показанном выше примере):

thread_pool_start(tpp);

exit(EXIT_SUCCESS);

управление никогда не дойдет до выполнения exit. Но существует еще третье допустимое значение, прямо не указанное в документации, но мельком упоминаемое в других местах документации:

0
— после старта пула поток, вызвавший
thread_pool_start
, продолжает свое естественное выполнение.

Например, некоторый фрагмент кода мог бы выглядеть

так:

thread_pool_attr_t att; // ...

thread_pool_t *tpp = thread_pool_create(&attr, 0);

thread_pool_start(tpp);

while (true) {

// выполнять некоторую отличную от пула работу

}

exit(EXIT_SUCCESS);

Как уже понятно из описаний,

thread_pool_create
возвращает указатель на управляющую структуру пула потоков, которая позже будет передана
thread_pool_start
. Если создание пула завершилось неудачей, то результатом выполнения будет
NULL
, а в
errno
будет установлен код ошибки (документацией предусмотрен только один код ошибки:
ENOMEM
— недостаточно памяти для размещения структур данных).

Примечание

Управляющая структура пула потоков описана так:

typedef struct _thread_pool thread_pool_t;

struct _thread_pool {

thread_pool_attr_t pool_attr;

unsigned created;

unsigned waiting;

unsigned flags;

unsigned reserved[3];

};

3. Последний шаг в процедуре запуска пула потоков:

int thread_pool_start(void* pool);

где

pool
— это указатель, возвращаемый
thread_pool_create
. [40]

При успешном завершении (которого почти никогда не происходит, за исключением значения флага

0
; об этом см. выше) функция возвращает
EOK
, в противном случае (что происходит гораздо чаще) — значение
– 1
.

4. Другие, относящиеся к библиотеке динамического пула потоков функции, которые целесообразно посмотреть в документации QNX (но которые в силу различных обстоятельств используются гораздо реже):

40

Вы спросите, почему указатель, возвращаемый

thread_pool_create
, имеет тип
thread_pool_t*
, а получающий его параметр
thread_pool_start
определен как
void*
? Это или неаккуратность разработчиков QNX, или глубокая сермяжная правда, которую мы пока не понимаем.

int thread_pool_destroy(thread_pool_t* pool);

int thread_pool_control(thread_pool_t* pool, thread_pool_attr_t* attr,

_Uint16t lower, _Uint16t upper, unsigned flags);

int thread_pool_limits(thread_pool_t* pool,

int lowater, int hiwater, int maximum, int increment, unsigned flags);

Менеджеры ресурсов

Поделиться:
Популярные книги

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Измена. Отбор для предателя

Лаврова Алиса
1. Отбор для предателя
Фантастика:
фэнтези
5.00
рейтинг книги
Измена. Отбор для предателя

Кодекс Крови. Книга II

Борзых М.
2. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга II

Шаг в бездну

Муравьёв Константин Николаевич
3. Перешагнуть пропасть
Фантастика:
фэнтези
космическая фантастика
7.89
рейтинг книги
Шаг в бездну

Часовая битва

Щерба Наталья Васильевна
6. Часодеи
Детские:
детская фантастика
9.38
рейтинг книги
Часовая битва

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Хроники странного королевства. Вторжение. (Дилогия)

Панкеева Оксана Петровна
110. В одном томе
Фантастика:
фэнтези
9.38
рейтинг книги
Хроники странного королевства. Вторжение. (Дилогия)

Часовой ключ

Щерба Наталья Васильевна
1. Часодеи
Фантастика:
фэнтези
9.36
рейтинг книги
Часовой ключ

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Очешуеть! Я - жена дракона?!

Амеличева Елена
Фантастика:
юмористическая фантастика
5.43
рейтинг книги
Очешуеть! Я - жена дракона?!

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9