Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform | страница 37
Для того чтобы увидеть, как «выглядит» многопоточная программа, можно запустить из командного интерпретатора команду >pidin
. Скажем, нашу программу зовут >spud
. Если мы выполняем >pidin
один раз до создания программой spud потоков, и еще раз — после того, как >spud
создала два потока (тогда всего их будет три), то вот как примерно будет выглядеть вывод (я укоротил вывод >pidin
для демонстрации только того, что относится к >spud
):
># pidin
>pid tid name prio STATE Blocked
>12301 1 spud 10r READY
># pidin
>pid tid name prio STATE Blocked
>12301 1 spud 10r READY
>12301 2 spud 10r READY
>12301 3 spud 10r READY
Вы можете видеть, что процесс >spud
(идентификатор процесса 12301) имеет три потока (столбец «tid» в таблице). Эти три поток» выполняются с приоритетом 10, с диспетчеризацией карусельного (RR) типа (обозначенной как «r» после цифры 10). Все три процесса находятся в состоянии готовности (READY), т. е. готовы использовать процессор, но в настоящее время не выполняются (поскольку в данный момент выполняется другой поток с более высоким приоритетом).
Теперь, когда мы знаем все о создании потоков, давайте рассмотрим, как и где мы можем этим воспользоваться.
Существует два класса задач, где можно было бы эффективно применять многопоточность.
Применение потоков хорошо там, где можно выполнять операции параллельно — например, в ряде математических задач (графика, цифровая обработка сигналов, и т.д.). Потоки также прекрасны там, где программа должна выполнять несколько независимых функций, при этом использующих общие данные — например, веб-сервер, который обслуживает несколько клиентов одновременно. Эти два класса задач мы здесь и рассмотрим.
Предположим, что мы имеем графическую программу, выполняющую алгоритм трассировки луча. Каждая строка растра на экране зависит от содержимого основной базы данных (которая описывает генерируемую картинку). Ключевым моментом здесь является то, что