Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемОльга Саламатина
1 Атрибуты потоков Атрибуты являются способом определить поведение потока, отличное от поведения по умолчанию. При создании потока с помощью pthread_create() или при инициализации переменной синхронизации может быть определен собственный объект атрибутов. Атрибуты определяются только во время создания потока; они не могут быть изменены в процессе использования.
2 Атрибуты потоков Обычно вызываются три функции: Инициализация атрибутов потока - pthread_attr_init() создает объект pthread_attr_t tattr по умолчанию. Изменение значений атрибутов (если значения по умолчанию не подходят) - разнообразные функции pthread_attr_*(), позволяющие установить значения индивидуальных атрибутов для структуры pthread_attr_t tattr. Создание потока - вызов pthread_create() с соответствующими значениями атрибутов в структуре pthread_attr_t tattr.
3 Атрибуты потоков Рассмотрим пример: #include pthread_attr_t tattr; pthread_t tid; void *start_routine; void arg ; int ret; /*атрибут ы по умолчанию*/ ret = pthread_attr_init(&tattr); /*вызов функций для изменения значений*/ ret=pthread_attr_* (&tattr, SOME_ATTRIBUTE_VALUE_PARAMETER); /* создание потока */ ret = pthread_create(&tid, &tattr, start_routine, arg);
4 Атрибуты потоков Объект атрибутов является закрытым и не может быть непосредственно изменен операциями присваивания. Как только атрибут инициализируется и конфигурируется, это доступен всему процессу. Поэтому рекомендуется конфигурировать все требуемые спецификации состояния один раз на ранних стадиях выполнения программы. При этом соответствующий объект атрибутов может использоваться везде, где это нужно.
5 Атрибуты потоков Использование объектов атрибутов имеет два основных преимущества: Во-первых, это обеспечивает мобильность кода. Даже в случае, когда поддерживаемые атрибуты могут измениться в зависимости от реализации, не нужно будет изменять вызовы функций, которые создают объекты потоков, потому что объект атрибутов скрыт от интерфейса. Задача портирования облегчается, потому что объекты атрибутов будут инициализироваться однажды и в определенном месте.
6 Атрибуты потоков Во-вторых, упрощается спецификация состояний в приложении. Пусть в пределах процесса существует несколько множеств потоков, при этом каждое обеспечивает отдельный сервис, и имеет свои собственные требования к состоянию. В некоторый момент на ранних стадиях приложения, можно инициализировать объект атрибутов потока для каждого множества. Все будущие вызовы создания потока будут обращаться к объекту атрибутов, инициализированному для этого типа потока.
7 Атрибуты потоков Объекты атрибутов требуют отдельного внимания во время выхода из процесса. Когда объект инициализируется, для него выделяется память. Эта память должна быть возвращена системе. Стандарт POSIX обеспечивает функции для удаления объектов атрибутов. Функция pthread_attr_init() используется, чтобы инициализировать объект атрибутов значениями по умолчанию. Память распределяется системой потоков во время выполнения.
8 Атрибуты потоков Пример вызова функции: #include pthread_attr_t tattr; int ret; ret = pthread_attr_init(&tattr); Функция возвращает 0 после успешного завершения. Любое другое значение указывает, что произошла ошибка. Код ошибки устанавливается в переменной errno. Значения по умолчанию для атрибутов ( tattr ) приведены в таблице.
9 Атрибуты потоков АтрибутЗначение по умолчанию Назначение detachstatePTHREAD_ CREATE_J OINABLE Управление состоянием потока (присоединя- бельный/отсоединябельный) schedpolicySCHED_OT HER Выбор политики диспетче- ризации: SCHED_OTHER (non-realtime), SCHED_RR (realtime) или SCHED_FIFO (realtime)
10 Атрибуты потоков АтрибутЗначение по умолчанию Назначение schedparam0Приоритет при диспетчери- зации, имеет смысл только для SCHED_RR и SCHED_FIFO inheritschedPTHREAD_ EXPLICIT_ SCHED Параметры диспетчериза- ции задаются или наследу- ются от родительского потока (PTHREAD_ INHERIT_SCHED)
11 Атрибуты потоков АтрибутЗначение по умолчанию Назначение scopePTHREAD_ SCOPE_SY STEM. Это единственное поддерживаемое значение
12 Атрибуты потоков Функция pthread_attr_destroy() использу- ется, чтобы удалить память для атрибутов, выделенную во время инициализации. Объект атрибутов становится недействительным. Пример вызова функции: #include pthread_attr_t tattr; int ret; ret = pthread_attr_destroy(&tattr); Функция возвращает 0 после успешного завершения или любое другое значение в случае ошибки.
13 Отделение потока Функция pthread_detach() является альтернативой pthread_join(), чтобы утилизировать область памяти для потока, который был создан с атрибутом detachstate = PTHREAD_CREATE_JOINABLE. Прототип : int pthread_detach(thread_t tid); Пример вызова функции: #include pthread_t tid; int ret; ret = pthread_detach(tid);
14 Отделение потока Функция pthread_detach() используется, чтобы указать реализации, что выделенная память для потока tid может быть утилизирована, когда поток завершится. Если tid не закончился, pthread_detach() не вызывает его завершения. pthread_detach() возвращает 0 при успешном завершении. Любое другое значение указывает, что произошла ошибка.
15 Состояние отделенного потока Если поток создается отделенным ( PTHREAD_CREATE_DETACHED ), его PID и другие ресурсы могут использоваться, как только он завершится. Для этого можно вызвать перед его созданием функцию pthread_attr_setdetachstate(). Если поток создается неотделенным ( PTHREAD_CREATE_JOINABLE ), предполагается, что создающий поток будет ожидать его завершения и выполнять pthread_join(). Независимо от типа потока, процесс не закончится, пока не завершатся все потоки.
16 Состояние отделенного потока pthread_attr_setdetachstate() возвращает 0 после успешного завершения или любое другое значение в случае ошибки. Пример вызова для отсоединения потока: #include pthread_attr_t tattr; int ret; ret = pthread_attr_setdetachstate(&tattr,PTHREAD_CREATE_DETACHED);
17 Состояние отделенного потока Следующий код иллюстрирует, как можно создать отделенный поток: #include pthread_attr_t tattr, _t tid; void *start_routine; void arg ; int ret; ret = pthread_attr_init(&tattr); ret = pthread_attr_setdetachstate (&tattr,PTHREAD_CREATE_DETACHED); ret = pthread_create(&tid, &tattr, start_routine, arg);
18 Состояние отделенного потока Функция pthread_attr_getdetachstate() позволяет определить состояние при создании потока, т.е. был ли он отделенным или присоединяемым. Она возвращает 0 после успешного завершения или любое другое значение в случае ошибки. Пример вызова: #include pthread_attr_t tattr; int detachstate; int ret; ret = pthread_attr_getdetachstate (&tattr, &detachstate);
19 Ограничения потока Поток может быть ограничен (имеет тип PTHREAD_SCOPE_SYSTEM ) или неограничен (имеет тип PTHREAD_SCOPE_PROCESS ). Оба этих типа доступны только в пределах данного процесса. Функция pthread_attr_setscope() позволяет создать потоки указанных типов. pthread_attr_setscope() возвращает 0 после успешного завершения или любое другое значение в случае ошибки.
20 Ограничения потока Пример вызова функции: #include pthread_attr_t attr, _t tid; void start_routine; void arg; int ret; ret = pthread_attr_init (&tattr); ret = pthread_attr_setscope (&tattr, PTHREAD_SCOPE_SYSTEM); ret = pthread_create (&tid, &tattr, start_routine, arg);
21 Ограничения потока Функция pthread_attr_getscope() используется для определения ограниченности потока. Пример вызова: #include pthread_attr_t tattr; int scope; int ret; ret = pthread_attr_getscope (&tattr, &scope); pthread_att_getscope() возвращает 0 после успешного завершения или любое другое значение в случае ошибки.
22 Дисциплина планирования потока Стандарт POSIX определяет несколько значений атрибута планирования: SCHED_FIFO, SCHED_RR (Round Robin), или SCHED_OTHER (метод приложения). Дисциплины SCHED_FIFO и SCHED_RR являются необязательными, и поддерживаются только для потоков в режиме реального времени. Библиотека pthread поддерживает только значение SCHED_OTHER. Попытка установить другое значение приведет к возникновению ошибки ENOSUP.
23 Дисциплина планирования потока Для ее установки используется функция: #include pthread_attr_t tattr; int ret; ret = pthread_attr_setschedpolicy (&tattr, SCHED_OTHER); Парной к ней является функция pthread_attr_getschedpolicy(), которая возвращает константу, определяющую дисциплину диспетчеризации.
24 Дисциплина планирования потока Функция pthread_attr_setinheritsched() используется для наследования дисциплины диспетчеризации из родительского потока. Если атрибут inherit = PTHREAD_ INHERIT_SCHED (по умолчанию), то будет использована дисциплина планирования родителя. Если используется константа PTHREAD_EXPLICIT_SCHED, используются атрибуты, переданные в вызове pthread_create().
25 Дисциплина планирования потока Функция возвращает 0 при успешном завершении, и любое другое значение в случае ошибки. Пример вызова этой функции: #include pthread_attr_t tattr; int ret; ret=pthread_attr_setinheritsched (&tattr, PTHREAD_EXPLICIT_SCHED);
26 Дисциплина планирования потока Функцию pthread_attr_getinheritsched (pthread_attr_t *tattr, int *inherit) можно использовать для получения информации о дисциплине планирования текущего потока. Параметры диспетчеризации определены в структуре sched_param; поддерживается только приоритет sched_param.sched_priority. Этот приоритет задается целым числом, при этом чем выше значение, тем выше приоритет потока при планировании. Создаваемые потоки получают этот приоритет.
27 Дисциплина планирования потока Функция pthread_attr_setschedparam() используется, чтобы установить значения в этой структуре. При успешном завершении она возвращает 0. Пример использования: #include pthread_attr_t tattr; int newprio; sched_param param; newprio = 2 0; param.sched_priority = newprio; ret = pthread_attr_setschedparam (&tattr, ¶m);
28 Дисциплина планирования потока Функция pthread_attr_getschedparam (pthread_attr_t *tattr, const struct sched_param *param) используется для получения приоритета текущего потока.
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.