Если поток создается отделенным (PTHREAD_CREATE_DETACHED), его ID и другие ресурсы могут многократно использоваться, как только он завершится. Если нет необходимости ожидать в вызывающем потоке завершения нового потока, можно вызвать перед его созданием функцию pthread_attr_setdetachstate().
Если поток создается неотделенным (PTHREAD_CREATE_JOINABLE), предполагается, что создающий поток будет ожидать его завершения и выполнять в созданном потоке pthread_join(). Независимо от типа потока процесс не закончится, пока не завершатся все потоки; pthread_attr_setdetachstate() возвращает 0 - после успешного завершения - или любое другое значение - в случае ошибки.
Пример вызова для отсоединения потока:
pthread_attr_t tattr;
int ret;
/* устанавливаем состояние потока */
ret = pthread_attr_setdetachstate(&tattr,
PTHREAD_CREATE_DETACHED);
Функция pthread_attr_getdetachstate() позволяет определить состояние при создании потока, т.е. был ли он отделенным или присоединяемым. Она возвращает 0 - после успешного завершения - или любое другое значение - в случае ошибки. Пример вызова:
pthread_attr_t tattr;
int detachstate;
int ret;
ret = pthread_attr_getdetachstate (&tattr, &detachstate);
Следующий пример иллюстрирует, как можно создать отделенный поток:
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);