C: Нужно ли мне отменить поток, который я закончил использовать?

#c #pthreads

Вопрос:

Я создаю поток на C, чтобы один раз проверить что-то на веб-странице во время выполнения. Должен ли я ЗАКРЫТЬ этот поток, или, как только он завершится, он будет автоматически удален?

 --> Imports
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

--> Start thread 
pthread_t thread_id;

pthread_create(amp;thread_id, NULL, threadFunction, NULL);


---> Thread function

void *threadFunction(void *vargp) { 

    //Do something...
    
    return NULL;
}
 

Комментарии:

1. Какую библиотеку потоков или стандарт вы используете? (Показать нам какой-нибудь код было бы еще более полезно.)

2. Что говорится в документации для вашей библиотеки потоков?

3. Поищите учебник по потокам, в котором обсуждаются концепции объединяемого потока, отсоединенного потока и отмены потока.

4. @jarmod Готово, извини за это. Совершенно новичок в C, так что все еще разбираюсь в основах

5. В двух словах, часто бывает достаточно создать отдельные потоки и разрешить выход потоков. Если важно знать, когда поток завершается, вы создаете присоединяемые потоки, а затем основной поток ожидает их завершения с помощью соединения. Отмена потока используется редко, но может использоваться, если поток заблокирован или заблокирован в точке отмены.

Ответ №1:

Вам не нужно рассматривать возможность использования pthread_cancel , если только цель не состоит в том, чтобы преждевременно завершить выполнение запущенного потока.

В большинстве случаев вы просто хотите, чтобы поток завершил свою работу. Обычно вы обнаруживаете, что поток завершен, соединяясь с ним, используя pthread_join .

Если вы создаете поток, который, как ожидается, не закончится, или не имеет значения, когда он закончится, вы можете создать отдельный поток или отсоединить его после создания с помощью pthread_detach . Тогда поток не может быть соединен.

Ваш пример кода передается NULL для атрибутов потока, что приводит pthread_create к использованию атрибутов по умолчанию. Вам следует проверить свою систему, но Linux по умолчанию создаст присоединяемые потоки.

Для большинства начинающих проектов, вероятно, проще всего создавать объединяемые потоки и вызывать основной поток pthread_exit после создания всех потоков. Это ожидает завершения выполнения каждого порожденного потока, прежде чем программа завершится.

В противном случае, если есть итоговая работа, которую основной поток должен выполнить после завершения потоков, он будет ждать в каждом потоке, pthread_join пока все потоки не вернутся. После возвращения последнего потока основной поток может сделать то, что ему нужно, а затем выйти.

Ответ №2:

В документации для pthread говорится следующее:

Поток создается при выполнении процедуры start_routine с единственным аргументом arg. Если возвращается функция start_routine, эффект будет таким, как если бы был неявный вызов функции pthread_exit (), использующей возвращаемое значение функции start_routine в качестве статуса выхода. Обратите внимание, что поток, в котором первоначально была вызвана функция main (), отличается от этого. Когда он возвращается из main(), эффект должен быть таким, как если бы был неявный вызов exit (), использующий возвращаемое значение main() в качестве статуса выхода.

Таким образом, нет необходимости явно завершать поток.

Комментарии:

1. Все еще есть ресурсы, которые необходимо очистить для присоединяемых потоков (с pthread_join ), иначе вы останетесь с «потоком зомби».