Создание открепленных потоков с помощью объекта атрибутов
После инициализации объекта потока его атрибуты можно модифицировать. Дл я установки атрибута detachstate атрибутного объекта используется функция pthread__attr_setdetachstate(). Параметр detachstate описывает поток как открепленный или присоединяемый.
Синопсис
#include <pthread.h>
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() не используется, поскольку открепленные потоки присоединить невозможно.
Больше книг — больше знаний!
Заберите 30% скидку новым пользователям на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ