next up previous contents
Next: Ограничения потока. Up: Атрибуты потоков. Previous: Атрибуты потоков.   Contents

Состояние отделенного потока.

Если поток создается отделенным (PTHREAD_CREATE_DETACHED), его ID потока и другие ресурсы могут многократно использоваться, как только он завершится. Если нет необходимости ожидать в вызывающем потоке завершения нового потока, можно вызвать перед его созданием функцию pthread_attr_setdetachstate().

Если поток создается неотделенным (PTHREAD_CREATE_JOINABLE), предполагается, что создающий поток будет ожидать его завершения и выполнять в созданном потоке pthread_join(). Независимо от типа потока, процесс не закончится, пока не завершатся все потоки.

pthread_attr_setdetachstate() возвращает 0 после успешного завершения или любое другое значение в случае ошибки.

Пример вызова для отсоединения потока:

#include <pthread.h>

pthread_attr_t tattr;

int ret;

/* устанавливаем состояние потока */

ret = pthread_attr_setdetachstate(&tattr,PTHREAD_CREATE_DETACHED);

Если не предусмотрено никакой явной синхронизации, то недавно созданный, отдельный поток может завершиться и переназначить свой ID на другой новый поток, прежде чем его создатель завершит вызов pthread_create(). Для неотделенного (PTHREAD_CREATE_JOINABLE) потока очень важно, чтобы после того, как он завершится, к нему присоединился другой поток, - иначе ресурсы этого потока не будут освобождены для использования новыми потоками. Это обычно приводит к утечке памяти. Если не требуется создавать поток, который будет присоединен, нужно создавать его отделенным.

Следующий код иллюстрирует, как можно создать отделенный поток (рис. 28):

#include <pthread.h> 

pthread_attr_t tattr;

pthread_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);

Рис. 28. Создание отделенного потока.

Функция pthread_attr_getdetachstate() позволяет определить состояние при создании потока, т.е. был ли он отделенным или присоединяемым. Она возвращает 0 после успешного завершения или любое другое значение в случае ошибки. Пример вызова:

#include <pthread.h>

pthread_attr_t tattr;

int detachstate;

int ret;

ret = pthread_attr_getdetachstate (&tattr, &detachstate);



2003-12-09