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 со вспомогательными данными, запрашивающими требуемое количество потоков. Передача вспомогательных данных приведет к желаемому результату только для сокетов типа «один-ко-многим».
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Обзор потоков
Обзор потоков Поток (thread) — это независимая единица выполнения в контексте процесса. Программист, разрабатывающий многопоточную программу, должен организовать выполнение потоков таким образом, чтобы это позволило упростить программу и воспользоваться
Идентификация потоков
Идентификация потоков Функции, используемые для получения идентификаторов (ID) и дескрипторов потоков, напоминают те, которые используются для аналогичных целей в случае процессов. • GetCurrentThread — возвращает ненаследуемый псевдодескриптор вызывающего
Состояния потоков
Состояния потоков На рис. 7.4, взятом из [9] (см. также [38], версию, обновленную Соломоном (Solomon) и Руссиновичем (Russinovych)), представлена схема планирования потоков и показаны их возможные состояния. Кроме того, этот рисунок иллюстрирует результаты работы программы. Такие
Стеки потоков и допустимые количества потоков
Стеки потоков и допустимые количества потоков Следует сделать еще два предостережения. Во-первых, подумайте о размере стека, который по умолчанию составляет 1 Мбайт. В большинстве случаев этого будет вполне достаточно, но если существуют какие-либо сомнения на сей счет,
Состояния потоков
Состояния потоков Несколько раз небрежно упомянув о «выполнении», «готовности» и «блокировке», давайте теперь формализуем эти состояния потока.Выполнение (RUNNING)Состояние выполнения (RUNNING) в QNX/Neutrino означает, что поток активно использует ресурсы процессора. В системе SMP
Пулы потоков
Пулы потоков Другое существенное дополнение в QNX/Neutrino — это понятие пула потоков. Вы будете часто обращать внимание в ваших программах на то обстоятельство, что вам хотелось бы иметь несколько потоков и управлять их поведением в определенных пределах. Например, для
(3.3) Когда открывается директория с большим количеством файлов, находящаяся на NTFS-разделе, например, WINNT, то это делается слишком долго. Можно ускорить этот процесс?
(3.3) Когда открывается директория с большим количеством файлов, находящаяся на NTFS-разделе, например, WINNT, то это делается слишком долго. Можно ускорить этот процесс? Когда открывается директория, то NTFS обновляет метку последнего доступа к файлам. Если файлов много и на всех
10.4.2 Анализ потоков
10.4.2 Анализ потоков Ричи упоминает о том, что им была предпринята попытка создания потоков только с процедурами "вывода" или только с процедурами обслуживания. Однако, процедура обслуживания необходима для управления потоками данных, так как модули должны иногда ставить
3.2. Когда открывается директория с большим количеством файлов, находящаяся на NTFS-разделе, например, WINDOWS, то это делается слишком долго. Можно ускорить этот процесс?
3.2. Когда открывается директория с большим количеством файлов, находящаяся на NTFS-разделе, например, WINDOWS, то это делается слишком долго. Можно ускорить этот процесс? Когда открывается директория, то NTFS обновляет метку последнего доступа к файлам. Если файлов много и на всех
Создание потоков
Создание потоков Обеспечить многопоточную обработку в приложении Qt достаточно просто: мы только создаем подкласс QThread и переопределяем его функцию run(). Чтобы показать, как это работает, мы начнем с рассмотрения программного кода очень простого подкласса QThread, который
Обзор потоков
Обзор потоков Каждый процесс Win32 имеет один главный "поток", выполняющий функции точки входа в приложение. В следующей главе будет выяснено, как создавать дополнительные потоки и соответствующий программный код, применяя возможности пространства имен System.Threading, но пока
Пул потоков CLR
Пул потоков CLR Заключительной темой нашего обсуждения в этой плаве, посвященной потокам, будет пул потоков CLR. При асинхронном вызове типов с помощью делегатов (посредством метода BeginInvoke()) нельзя сказать, что среда CLR буквально создает совершенно новый поток. В целях
Управление буферизацией потоков
Управление буферизацией потоков Открытые файлы, для которых осуществляется высокоуровневый ввод/вывод, буферизуются по умолчанию, за исключением потоков stdin, stdout, stderr, stdaux, stdprn.Потоки stderr и stdaux — не буферизованы. Если к ним применяется функция printf или scanf, создается
Закрытие потоков
Закрытие потоков Функции fclose и fcloseall закрывают поток или потоки. Функция fclose закрывает один заданный поток, fcloseall — все потоки, кроме потоков stdin, stdout, stderr, stdaux, stdprn.Если программа не выполняет закрытия потоков, потоки автоматически закрываются, когда программа завершается
8.3.4 Копирование Потоков
8.3.4 Копирование Потоков Есть возможность копировать потоки. Например:cout = cerr;В результате этого получаются две переменные, ссылающися на один и тот же поток. Гавным образом это бывает полезно для того, чтобы сделать стандартное имя вроде cin ссылающимся на что-то другое