Вход/Регистрация
Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
вернуться

Кёртен Роб

Шрифт:

pthread_t tid;

pthread_create(&tid, ...

printf("Новый поток имеет идентификатор %d\n", tid);

Такое применение совершенно типично, потому что вам часто может потребоваться знать, какой поток выполняет какой участок кода.

Небольшой тонкий момент. Новый поток может начать работать еще до присвоения значения параметру tid. Это означает, что вы должны внимательно относиться к использованию tid в качестве глобальной переменной. В примере, приведенном выше, все будет корректно, потому что вызов pthread_create отработал до использования tid, что означает, что на момент использования tid имел корректное значение.

Новый поток начинает выполнение с функции start_routine, с параметром arg.

Атрибутная запись потока

Когда вы осуществляете запуск нового потока, он может следовать ряду четко определенных установок по умолчанию, или же вы можете явно задать его характеристики.

Прежде, чем мы перейдем к обсуждению задания атрибутов потока, рассмотрим тип данных

pthread_attr_t
:

typedef struct {

 int flags;

 size_t stacksize;

 void *stackaddr;

 void (*exitfunc)(void *status);

 int policy;

 struct sched_param param;

 unsigned guardsize;

} pthread_attr_t;

В основном эти поля используются как:

flags Неисчисляемые (булевы) характеристики потока — например, создается поток как «обособленный» или «синхронизирующий».
stacksize, stackaddr и guardsize Параметры стека.
exitfunc Функция, выполняемая перед завершением потока.
policy и param Параметры диспетчеризации.

Доступны следующие функции:

Управление атрибутами

pthread_attr_destroy

pthread_attr_init

Флаги (булевы характеристики)

pthread_attr_getdetachstate

pthread_attr_setdetachstate

pthread_attr_getinheritsched

pthread_attr_setinheritsched

pthread_attr_getscope

pthread_attr_setscope

Параметры стека

pthread_attr_getguardsize

pthread_attr_setguardsize

pthread_attr_getstackaddr

pthread_attr_setstackaddr

pthread_attr_getstacksize

pthread_attr_setstacksize

Параметры диспетчеризации

pthread_attr_getschedparam

pthread_attr_setschedparam

pthread_attr_getschedpolicy

pthread_attr_setschedpolicy

Список выглядит довольно большим (18 функций), но в действительности нас будет заботить применение только примерно половины функций из этого списка, потому что все эти они сгруппированы по парам «get» — «set», т.е. в каждой паре есть функция как получения параметров (get), так и их установки (set) — за исключением функций pthread_attr_init и pthread_attr_destroy.

Прежде чем мы исследуем назначения атрибутов, следует отметить одно обстоятельство. Вы обязаны вызвать pthread_attr_init для инициализации атрибутной записи до момента ее использования, задействовать ее с помощью соответствующей функции (функций) pthread_attr_set* и только затем вызвать функцию pthread_create для создания потока. Изменение атрибутной записи после того, как поток уже создан, не будет иметь никакого действия.

Администрирование атрибутов потока

Перед использованием атрибутной записи для ее инициализации следует вызвать функцию pthread_attr_init:

...

pthread_attr_t attr;

...

pthread_attr_init(&attr);

Вы можете также вызывать pthread_attr_destroy для «деинициализации» атрибутной записи потока, но так обычно никто не делает (если не требуется жесткой POSIX-совместимости).

В приведенных ниже описаниях значения по умолчанию помечены комментарием «(по умолчанию)».

Атрибут потока «flags» (флаги)

Три функции — pthread_attr_setdetachstate, pthread_attr_setinheritsched и pthread_attr_setscope — определяют, создается ли поток как «синхронизирующий» («joinable») или как «обособленный» (detached), наследует ли поток атрибуты диспетчеризации от создающего потока или использует атрибуты диспетчеризации, указанные в функциях pthread_attr_setschedparam и pthread_attr_setschedpolicy, и, наконец, имеет ли поток масштаб «системы» или «процесса».

  • Читать дальше
  • 1
  • ...
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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