10.6. Управление количеством потоков

10.6. Управление количеством потоков

Мы рассмотрели пример использования потоков SCTP, но пока что мы не знаем, каким образом можно контролировать количество потоков, запрашиваемых конечной точкой в процессе инициализации ассоциации. В предыдущих примерах мы работали с тем количеством исходящих потоков, которое было установлено в системе по умолчанию. В реализации SCTP для FreeBSD, созданной в рамках проекта KAME, это значение равно 10. А что, если серверу и клиенту нужно больше десяти потоков? В листинге 10.6 мы приводим модификацию кода сервера, позволяющую увеличивать количество потоков, запрашиваемое при создании ассоциации. Обратите внимание, что данный параметр сокета должен быть изменен до создания ассоциации.

Листинг 10.6. Вариант сервера, допускающий увеличение числа потоков

//sctp/sctpserv02.c

14 if (argc 2)

15  stream_increment = atoi(argv[1]);

16 sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);

17 bzero(&initm, sizeof(initm));

18 initm.sinit_num_ostreams = SERV_MORE_STRMS_SCTP;

19 Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_INITMSG, &initm, sizeof(initm));

Предварительная настройка

14-16 Как и в предыдущей версии программы, сервер устанавливает флаг stream_increment в соответствии с дополнительным параметром командной строки, после чего открывает сокет.

Изменение запрашиваемого количества потоков

17-19 Все сделанные модификации относятся именно к этим строкам. Сначала сервер обнуляет структуру sctp_initmsg. Это изменение гарантирует, что вызов setsockopt не приведет к непреднамеренному изменению каких-либо иных значений кроме того, которое нас интересует. Затем сервер устанавливает поле sinit_max_ostreams равным количеству запрашиваемых потоков. После этого вызывается функция setsockopt с параметром сокета SCTP_INITMSG для установки параметров сообщения INIT.

Альтернативой установке параметра сокета может быть вызов функции sendmsg со вспомогательными данными, запрашивающими требуемое количество потоков. Передача вспомогательных данных приведет к желаемому результату только для сокетов типа «один-ко-многим».

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

8.3.4 Копирование Потоков

Из книги C++ автора Хилл Мюррей

8.3.4 Копирование Потоков Есть возможность копировать потоки. Например:cout = cerr;В результате этого получаются две переменные, ссылающися на один и тот же поток. Гавным образом это бывает полезно для того, чтобы сделать стандартное имя вроде cin ссылающимся на что-то другое


10.4.2 Анализ потоков

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

10.4.2 Анализ потоков Ричи упоминает о том, что им была предпринята попытка создания потоков только с процедурами "вывода" или только с процедурами обслуживания. Однако, процедура обслуживания необходима для управления потоками данных, так как модули должны иногда ставить


Обзор потоков

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Обзор потоков Каждый процесс Win32 имеет один главный "поток", выполняющий функции точки входа в приложение. В следующей главе будет выяснено, как создавать дополнительные потоки и соответствующий программный код, применяя возможности пространства имен System.Threading, но пока


Пул потоков CLR

Из книги Win2K FAQ (v. 6.0) автора Шашков Алексей

Пул потоков CLR Заключительной темой нашего обсуждения в этой плаве, посвященной потокам, будет пул потоков CLR. При асинхронном вызове типов с помощью делегатов (посредством метода BeginInvoke()) нельзя сказать, что среда CLR буквально создает совершенно новый поток. В целях


(3.3) Когда открывается директория с большим количеством файлов, находящаяся на NTFS-разделе, например, WINNT, то это делается слишком долго. Можно ускорить этот процесс?

Из книги WinXP FAQ (Часто задаваемые вопросы по ОС Windows XP) автора Шашков Алексей

(3.3) Когда открывается директория с большим количеством файлов, находящаяся на NTFS-разделе, например, WINNT, то это делается слишком долго. Можно ускорить этот процесс? Когда открывается директория, то NTFS обновляет метку последнего доступа к файлам. Если файлов много и на всех


3.2. Когда открывается директория с большим количеством файлов, находящаяся на NTFS-разделе, например, WINDOWS, то это делается слишком долго. Можно ускорить этот процесс?

Из книги Системное программирование в среде Windows автора Харт Джонсон М

3.2. Когда открывается директория с большим количеством файлов, находящаяся на NTFS-разделе, например, WINDOWS, то это делается слишком долго. Можно ускорить этот процесс? Когда открывается директория, то NTFS обновляет метку последнего доступа к файлам. Если файлов много и на всех


Обзор потоков

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Обзор потоков Поток (thread) — это независимая единица выполнения в контексте процесса. Программист, разрабатывающий многопоточную программу, должен организовать выполнение потоков таким образом, чтобы это позволило упростить программу и воспользоваться


Идентификация потоков

Из книги Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform автора Кёртен Роб

Идентификация потоков Функции, используемые для получения идентификаторов (ID) и дескрипторов потоков, напоминают те, которые используются для аналогичных целей в случае процессов. • GetCurrentThread — возвращает ненаследуемый псевдодескриптор вызывающего


Состояния потоков

Из книги QT 4: программирование GUI на С++ автора Бланшет Жасмин

Состояния потоков На рис. 7.4, взятом из [9] (см. также [38], версию, обновленную Соломоном (Solomon) и Руссиновичем (Russinovych)), представлена схема планирования потоков и показаны их возможные состояния. Кроме того, этот рисунок иллюстрирует результаты работы программы. Такие


Стеки потоков и допустимые количества потоков

Из книги автора

Стеки потоков и допустимые количества потоков Следует сделать еще два предостережения. Во-первых, подумайте о размере стека, который по умолчанию составляет 1 Мбайт. В большинстве случаев этого будет вполне достаточно, но если существуют какие-либо сомнения на сей счет,


Управление буферизацией потоков

Из книги автора

Управление буферизацией потоков Открытые файлы, для которых осуществляется высокоуровневый ввод/вывод, буферизуются по умолчанию, за исключением потоков stdin, stdout, stderr, stdaux, stdprn.Потоки stderr и stdaux — не буферизованы. Если к ним применяется функция printf или scanf, создается


Закрытие потоков

Из книги автора

Закрытие потоков Функции fclose и fcloseall закрывают поток или потоки. Функция fclose закрывает один заданный поток, fcloseall — все потоки, кроме потоков stdin, stdout, stderr, stdaux, stdprn.Если программа не выполняет закрытия потоков, потоки автоматически закрываются, когда программа завершается


Состояния потоков

Из книги автора

Состояния потоков Несколько раз небрежно упомянув о «выполнении», «готовности» и «блокировке», давайте теперь формализуем эти состояния потока.Выполнение (RUNNING)Состояние выполнения (RUNNING) в QNX/Neutrino означает, что поток активно использует ресурсы процессора. В системе SMP


Пулы потоков

Из книги автора

Пулы потоков Другое существенное дополнение в QNX/Neutrino — это понятие пула потоков. Вы будете часто обращать внимание в ваших программах на то обстоятельство, что вам хотелось бы иметь несколько потоков и управлять их поведением в определенных пределах. Например, для


Создание потоков

Из книги автора

Создание потоков Обеспечить многопоточную обработку в приложении Qt достаточно просто: мы только создаем подкласс QThread и переопределяем его функцию run(). Чтобы показать, как это работает, мы начнем с рассмотрения программного кода очень простого подкласса QThread, который