Будет ли освобождена память в куче, когда я сделаю pthread_cancel на iOS? - PullRequest
1 голос
/ 18 февраля 2011

Допустим, я выделил некоторую память в фоновом потоке, то есть стек потоков содержит указатель на эту память.Теперь я хочу завершить фоновое выполнение потока, вызвав на нем pthread_cancel.Будет ли эта память освобождена или нет?(Моя платформа iOS, компилятор gcc 4.2)

Ответы [ 4 ]

3 голосов
/ 18 февраля 2011

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

Как правило, избегайте использования pthread_cancel, поскольку трудно обеспечить безопасную работу pthread_cancel.Скорее встроите некоторый механизм, где вы можете передать сообщение потоку, чтобы уничтожить себя (после освобождения любых ресурсов, которыми он владеет).

0 голосов
/ 18 февраля 2011

Нет, он не будет удален или освобожден автоматически. Если вам очень повезло, возможно, когда-нибудь вы соберете мусор. Файловые дескрипторы, идентификаторы общей памяти, мьютексы и т. Д. Также не будут освобождены / освобождены. Асинхронное аннулирование безопасно, например, для чисто математические вычисления для данных, которые все еще принадлежат другому потоку, но в целом очень рискованные - поэтому некоторые API-интерфейсы с потоками экспериментировали и полностью удалили функцию.

0 голосов
/ 18 февраля 2011

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

0 голосов
/ 18 февраля 2011

Стек потока будет удален после выхода из потока.Но не будет никакого процесса или кода, который будет проверять ваш стек потоков и освобождать любые ссылки на объекты, которые вы разместили в куче.Также, как правило, стеки потоков не содержат никаких ссылок на память, стек потоков - это независимое пространство, которое предоставляется потоку для использования в общем программном стеке, любая ссылка будет находиться в стеке до тех пор, пока вывнутри функции, которая поместила такую ​​ссылку в стек, обычно потому, что вы ссылаетесь на нее локальной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...