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

на главную - закладки

Жанры

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

12: [0000000]->[0004516] ... [0005017]->[0005018]

3: [0005501]->[0005501] ... [0006003]->[0006003]

5: [0008024]->[0008024] ... [0008526]->[0008526]

7: [0008038]->[0008526] ... [0009028]->[0009028]

4: [0009273]->[0009273] ... [0009775]->[0009775]

6: [0010377]->[0010377] ... [0010878]->[0010878]

8: [0010590]->[0010878] ... [0011380]->[0011380]

9: [0010952]->[0011380] ... [0011882]->[0011882]

12: [0011297]->[0011882] ... [0012384]->[0012384]

11: [0011356]->[0012384] ... [0012886]->[0012886]

10: [0012024]->[0012886] ... [0013387]->[0013388]

3: [0012874]->[0013388] ... [0013889]->[0013889]

7: [0014888]->[0014888] ... [0015390]->[0015390]

4: [0016254]->[0016254] ... [0016756]->[0016756]

5: [0017646]->[0017646] ... [0018148]->[0018148]

6: [0019088]->[0019088] ... [0019590]->[0019590]

11: [0020206]->[0020206] ... [0020708]->[0020708]

8: [0020320]->[0020708] ... [0021210]->[0021210]

10: [0021078]->[0021210] ... [0021712]->[0021712]

12: [0021384]->[0021712] ... [0022213]->[0022213]

7: [0021630]->[0022213] ... [0022715]->[0022715]

9: [0021811]->[0022715] ... [0023217]->[0023217]

3: [0022009]->[0023217] ... [0023719]->[0023719]

Динамический

пул потоков

Динамический пул потоков не является каким-то специфическим механизмом, продиктованным именно микроядерной архитектурой QNX. Это удачная искусственная конструкция, все определения которой размещены в файле

<sys/dispatch.h>
. Удивительно не то, что в составе API QNX имеется такой механизм, а то, что подобные инструменты отсутствуют в других ОС.

В предыдущих примерах кода мы неоднократно создавали наборы потоков для тех или иных целей, но всем им было присуще одно: общее количество потоков в них было фиксированным на момент создания. Это и были статическиепулы потоков, разделяющих между собой работу приложения. Архитекторы QNX идут чуть дальше: они предоставляют инструментарий для создания пулов однотипных(с общей функцией потока) потоков, в которых конкретное число потоков может увеличиваться или уменьшаться синхронно с изменением нагрузки на приложение. Именно своим динамическимсоставом эта конструкция и отличается.

Динамический пул потоков нужен разработчикам QNX в первую очередь как инструмент построения многопоточных менеджеров ресурсов - основы построения сервисов ОС QNX. Но и помимо

этой цели динамический пул потоков представляет собой мощнейшее средство для конструирования параллельных механизмов обработки.

Проиллюстрируем применение динамического пула потоков примером программного кода, который был нами описан в книге [4] в главе «Сервер TCP/IP... много серверов хороших и разных». По сути, это ретранслирующий TCP/IP-сервер, но сейчас это для нас неважно:

Сервер на базе динамического пула потоков

#include <pthread.h>

#include <sys/dispatch.h>

static int ls; // прослушивающий TCP-сокет

THREAD_POOL_PARAM_T* alloc(THREAD_POOL_HANDLE_T* h) {

return (THREAD_POOL_PARAM_T*)h;

}

// функция блокирования пула потоков

THREAD_POOL_PARAM_T* block(THREAD_POOL_PARAM_T* p) {

int rs = accept(ls, NULL, NULL);

if (rs < 0) errx("accept error");

return(THREAD_POOL_PARAM_T*)rs;

}

int handler(THREAD_POOL_PARAM_T* p) {

retrans((int)p);

close((int)p);

delay(250);

cout << pthread_self << flush;

return 0;

}

int main(int argc, char* argv[]) {

// создать TCP-сокет на порт

ls = getsocket(THREAD_POOL_PORT);

// создание атрибутной записи пула потоков:

thread_pool_attr_t attr;

memset(&attr, 0, sizeof(thread_pool_attr_t));

// заполнение блока атрибутов пула

/* - mm число блокированных потоков в пуле */

attr.lo_water = 3;

/* - max число блокированных потоков в пуле */

attr.hi_water = 7;

/* - инкремент шага создания потоков */

attr.increment = 2;

attr.maximum = 9;

/* - общий предел числа потоков в пуле */

attr.handle = dispatch_create;

attr.context_alloc = alloc;

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

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

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
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