Подтвердить что ты не робот

Pthread_detach вопрос

До недавнего времени у меня создалось впечатление, что если вы "отсоединяете" поток после его нереста, поток живет даже после завершения "основного" потока.

Но небольшой эксперимент (перечисленный ниже) противоречит моей вере. Я ожидал, что отдельная нить будет продолжать печатать "Говорить из отсоединенной нити" даже после того, как основной закончен, но это, похоже, не происходит. Приложение, по-видимому, заканчивается...

Отсоедините "отсоединенные" нити после "основных" проблем return 0?

#include <pthread.h>
#include <stdio.h>

void *func(void *data)
{
    while (1)
    {
        printf("Speaking from the detached thread...\n");
        sleep(5);
    }
    pthread_exit(NULL);
}

int main()
{
    pthread_t handle;
    if (!pthread_create(&handle, NULL, func, NULL))
    {
        printf("Thread create successfully !!!\n");
        if ( ! pthread_detach(handle) )
            printf("Thread detached successfully !!!\n");
    }

    sleep(5);
    printf("Main thread dying...\n");
    return 0;
}
4b9b3361

Ответ 1

Чтобы процитировать Руководство для программистов Linux:

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

Также из Руководство для программистов Linux:

Чтобы другие потоки продолжались исполнение, основной поток должен завершите вызов pthread_exit()а не exit(3).

Ответ 2

pthread_detach просто означает, что вы больше не собираетесь присоединяться к потоку. Это позволяет библиотеке pthread знать, может ли она немедленно избавиться от ресурсов потока после того, как поток выйдет (отсоединенный случай), или он должен содержать их, потому что позже вы можете вызвать pthread_join в потоке.

Как только основные возвращаются (или выходят) ОС будет пожинать все ваши потоки и уничтожить ваш процесс.

Ответ 3

pthread_detach не делает то, что вы думаете, что он делает - он указывает на реализацию, что пространство, в котором используется поток с указанным идентификатором, может быть исправлено, как только оно завершается, т.е. на нем будет выполняться операция pthread_join.

Все потоки завершаются, как только процесс, содержащий их, завершается.

Ответ 4

Да, отсоединенные потоки будут умирать после return 0.

В разделе NOTES man pthread_detach

Отключенный атрибут просто определяет поведение системы когда поток завершается; оно делает не препятствовать тому, чтобы нить завершается, если процесс завершается используя выход (3) (или, приравненно, если возвращается основной поток)

Ответ 5

От man pthread_detach:

Функция pthread_detach() отмечает поток, идентифицированный потоком как отсоединенный. Когда отдельный поток завершается, его ресурсы автоматически отбрасываются обратно в систему без необходимости присоединения другого потока к завершенному потоку.