• размер стека потока;
• местоположение стека потока;
• стратегия планирования, наследование и параметры;
• тип потока: открепленный или присоединяемый;
• область конкуренции потока.
Для типа pthread_attr_t предусмотрен ряд методов, которые могут быть вызваны для установки или считывания каждого из перечисленных выше атрибутов (см. табл. 4.3).
Для инициализации и разрушения атрибутного объекта потока используются функции pthread_attr_init () и pthread_attr_destroy () соответственно.
Синопсис
#include
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread attr__t *attr) ;
Функция pthread_attr_init () инициализирует атрибутный объект потока с помощью стандартных значений, действующих для всех этих атрибутов. Параметр attr представляет собой указатель на объект типа pthread_attr_t. После инициализации attr-объекта значения его атрибутов можно изменить с помощью функций, перечисленных в табл. 4.3. После соответствующей модификации атрибутов значение attr используется в качестве параметра при вызове функции создания потока pthread_create(). При успешном выполнении эта функция возвращает число 0, в противном случае — код ошибки. Функция pthread_attr_init() завершится неуспешно, если для создания объекта в системе недостаточно памяти.
Функцию pthread_attr_destroy() можно использовать для разрушения объекта типа pthread_attr_t, заданного параметром attr. При обращении к этой функ ц ии будут удалены любые скрытые данные, связанные с этим атрибутным объектом потока. При успешном выполнении эта функция возвращает число 0, в противном случае - код ошибки.
Создание открепленных потоков с помощью объекта атрибутов
После инициализации объекта потока его атрибуты можно модифицировать. Дл яустановки атрибута detachstate атрибутного объекта используется функция pthread__attr_setdetachstate(). Параметр detachstate описывает поток как открепленный или присоединяемый.
Синопсис
#include
int pthread_attr_setdetachstate(
pthread_attr_t *attr,
int *detachstate
);
int pthread_attr_getdetachstate(
const pthread_attr_t *attr,
int *detachstate
);
Параметр detachstateможет принимать одно из следующих значений:
PTHREAD_CREATE_DETACHED
PTHREAD_CREATE_JOINABLE
Значение PTHREAD_CREATE_DETACHED «превращает» все потоки, которые используют этот атрибутный объект, в открепленные, а значение PTHREAD_CREATE_JОINABLE— в присоединяемые. Значение PTHREAD_CREATE_JOINABLEатрибут detachstateпринимает по умолчанию. При успешном выполнении функция pthread_attr_setdetachstate() возвращает число 0 ,в противном случае — код ошибки. Эта функция выполнится неуспешно, если значение параметра detachstateокажется недействительным.
Функция pthread_attr_getdetachstate() возвращает значение атрибута detachstateатрибутного объекта потока. При успешном выполнении эта функция возвращает значение атрибута detachstateв параметре detachstateи число 0 обычным способом. При неудаче функция возвращает код ошибки. В листинге 4.2 показано, как открепляются потоки, созданные в программе4.1. В этом примере при создании одного из потоков используется объект атрибутов.
// Листинг 4.2. Использование атрибутного объекта для // создания открепленного потока
int main(int argc, char *argv[]) {
pthread_t ThreadA,ThreadB;
pthread_attr_t DetachedAttr;
int N;
if(argc != 2) {
cout « «Ошибка» << endl; exit (1);
}
N = atoi(argv[1]);
pthread_attr_init(&DetachedAttr);
pthread_attr_setdetachstate(&DetachedAttr,PTHREAD_CREATE_DETACHED);
pthread_create(&ThreadA,NULL, task1, &N);
pthread_create(&ThreadB,&DetachedAttr,task2 , &N);
cout << «Ожидание присоединения потока А.» << endl; pthread_join(ThreadA,NULL);
return (0) ;
}
В листинге 4.2 объявляется атрибутный объект DetachedAttr, для инициализации которого используется функция pthread_attr_init(). После инициализации этого объекта вызывается функция pthread_attr_detachstate(), которая изменяет свойство detachstate («присоединяемость»), установив значение PTHREAD_CREATE_DETACHED («открепленность»). При создании потока ThreadB с помощью функции pthread_create() в качестве ее второго аргумента используется модифицированный объект DetachedAttr. Для потока ThreadB вызов функции pthread_join() не используется, поскольку открепленные потоки присоединить невозможно.
Создавая приложение с несколькими потоками, можно по-разному организовать их выполнение, использование ими ресурсов и состязание за ресурсы. Управление потоками по большей части осуществляется путем установки стратегий планирования и значений приоритета. Эти факторы влияют на эффективность потока. Кроме них, эффективность потока также определяется тем, как потоки состязаются за ресурсы: в рамках одного процесса либо в масштабе всей системы. Стратегию планирования, приоритет и область конкуренции потока можно установить с помощью объекта атрибутов потока. Поскольку потоки совместно используют ресурсы, доступ к ним необходимо синхронизировать. Эту тему мы кратко затронем в этой главе и более подробно— в главе 5. К вопросам синхронизации также относятся и такие: где и как завершаются и аннулируются потоки.
Читать дальше