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) потока очень важно, чтобы после того, как он завершится, к нему присоединился другой поток, - иначе ресурсы этого потока не будут освобождены для использования новыми потоками. Это обычно приводит к утечке памяти. Если не требуется создавать поток, который будет присоединен, нужно создавать его отделенным.

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

#include <pthread.h>

pthread_attr_t tattr;

int detachstate;

int ret;

ret = pthread_attr_getdetachstate (&tattr, &detachstate);

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

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



2004-06-22