освобождает ли pthread_join кучу, удерживаемую завершенным потоком?

#c #multithreading #pthreads

#c #многопоточность #pthreads

Вопрос:

Я читал учебник, в котором говорится:

int pthread_join(pthread_t tid, void **thread_return);

Функция pthread_join блокируется до завершения потока tid, присваивает общий (void *) указатель, возвращаемый подпрограммой потока, местоположению, на которое указывает thread_return , а затем использует все ресурсы памяти, удерживаемые завершенным потоком.

Я немного смущен ресурсами памяти, удерживаемыми завершенным потоком, похоже, что pthread_join будет вызывать free неявно, чтобы освободить память кучи в завершенном потоке, но очевидно, что это неверно, например:

 void *thread(void *arg) {
  char *ret;

  if ((ret = (char*) malloc(20)) == NULL) {       //<------------allocated heap memory
    perror("malloc() error");
    exit(2);
  }
  strcpy(ret, "This is a test");
  pthread_exit(ret);
}

main() {
  pthread_t thid;
  void *ret;

  if (pthread_create(amp;thid, NULL, thread, NULL) != 0) {
    perror("pthread_create() error");
    exit(1);
  }

  if (pthread_join(thid, amp;ret) != 0) {          
    perror("pthread_create() error");
    exit(3);
  }

  printf("thread exited with '%s'n", ret);
}
  

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

Итак, какие ресурсы памяти, удерживаемые завершенным потоком, будут использованы?

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

1. Я думаю, что это просто относится к памяти, используемой для представления потока, а не к памяти, используемой кодом потока.

2. Также будет освобождено любое «локальное хранилище потока» для потока.

Ответ №1:

Чтобы создать поток; обычно что-то где-то (например, возможно, библиотека, возможно, ядро) Должно выделить стек для нового потока, создать где-то для хранения его состояния (регистры и т. Д.), Когда он не использует процессор, Создать где-то для хранения метаданных (маска сигнала, приоритет, время процессораиспользуется и т. Д.), выделяет место для локального хранилища своего потока и т. Д. Все эти вещи должны быть освобождены; но это «внутренние вещи», за которые ваш код не отвечает (за которые должна отвечать библиотека).

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