#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:
Чтобы создать поток; обычно что-то где-то (например, возможно, библиотека, возможно, ядро) Должно выделить стек для нового потока, создать где-то для хранения его состояния (регистры и т. Д.), Когда он не использует процессор, Создать где-то для хранения метаданных (маска сигнала, приоритет, время процессораиспользуется и т. Д.), выделяет место для локального хранилища своего потока и т. Д. Все эти вещи должны быть освобождены; но это «внутренние вещи», за которые ваш код не отвечает (за которые должна отвечать библиотека).
Вещи, которые вы контролируете (память из кучи), в основном принадлежат процессу и не принадлежат какому-либо конкретному потоку; и не будут освобождены при завершении любого потока (если только последний поток не завершится, что приведет к завершению процесса, поскольку в нем не осталось потоков).