Если поток создается отделенным (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);
Журнал "Linux Format" (Линукс Формат)- Единственный в России и странах СНГ журнал на русском языке,
посвящённый Linux и свободному ПО. Журнал для IT-директоров, IT-менеджеров, программистов, системных
администраторов, учителей школ и преподавателей ВУЗов и всех пользователей ПК. В каждом выпуске: Новости
индустрии OpenSource, обзоры новинок свободного ПО, обучающие и методические статьи.
Каждый, кто оформит подписку, получает бонус- объёмные наклейки на системный блок и подарки: с одним из
первых выпусков журнала в 2012 году- диск с архивом номеров за 2005-2011 г.г. и ежемесячно электронную
версию журнала в pdf-формате.
Подробнее о проведении акции вы можете прочитать на
странице сайта.