Шрифт:
Такое применение совершенно типично, потому что вам часто может потребоваться знать, какой поток выполняет какой участок кода.
Новый поток начинает выполнение с функции start_routine, с параметром arg.
Когда вы осуществляете запуск нового потока, он может следовать ряду четко определенных установок по умолчанию, или же вы можете явно задать его характеристики.
Прежде, чем мы перейдем к обсуждению задания атрибутов потока, рассмотрим тип данных
В основном эти поля используются как:
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_destroy для «деинициализации» атрибутной записи потока, но так обычно никто не делает (если не требуется жесткой POSIX-совместимости).
В приведенных ниже описаниях значения по умолчанию помечены комментарием «(по умолчанию)».
Три функции — pthread_attr_setdetachstate, pthread_attr_setinheritsched и pthread_attr_setscope — определяют, создается ли поток как «синхронизирующий» («joinable») или как «обособленный» (detached), наследует ли поток атрибуты диспетчеризации от создающего потока или использует атрибуты диспетчеризации, указанные в функциях pthread_attr_setschedparam и pthread_attr_setschedpolicy, и, наконец, имеет ли поток масштаб «системы» или «процесса».