Ptheard убьет свободную динамическую память, выделенную в функции потока? - PullRequest
2 голосов
/ 09 августа 2010

У меня есть функция потока, которая выделяет память с помощью malloc (). Я уничтожаю поток, используя pthread_kill, не освобождая динамически выделенную память. Будет ли он освобожден автоматически после вызова pthread_kill, или будет утечка?

Ответы [ 4 ]

3 голосов
/ 09 августа 2010

Как говорит Викачу, будет утечка.

Я бы никогда не порекомендовал использовать pthread_kill, если в этом нет необходимости.Вместо этого вы должны создать механизм сигнализации, чтобы поток знал, когда он должен быть завершен, а затем присоединиться к потоку.И функция потока должна время от времени опрашивать это значение, и если она получает сигнал завершения, она должна очистить свои собственные ресурсы и выйти.

Другой вариант, конечно, состоит в том, чтобы не выделять память в потоках.,Но я думаю, вы не всегда получаете такую ​​роскошь.: -)

3 голосов
/ 09 августа 2010

Память, которую вы выделяете в одном потоке, не «принадлежит» этому потоку. Он распределяется из той же глобальной кучи, которую используют все остальные потоки вашей программы. Таким образом, вы должны освободить всю выделенную память, в противном случае вы получите утечку.

1 голос
/ 09 августа 2010

будет утечка.Как функция pthreads kill может знать имена переменных, которые были назначены через malloc?В C нет сборки мусора, если вы вызываете malloc где-то, вам лучше убедиться, что вы вызываете free где-то еще.

[ Edit ] Может быть, вам следует просто установить глобальную переменную flagс вашим потоком, и пусть ваш поток опрашивает эту переменную время от времени, чтобы знать, когда и когда она должна завершиться сама.

0 голосов
/ 02 сентября 2011

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

Это потому, что pthread_kill не убиваетпоток, он отправляет сигнал в поток.Если действие этого сигнала состоит в том, чтобы завершить процесс , то весь процесс перестает существовать, а вместе с ним любая динамическая память, выделенная любым потоком в процессе.

Нет способа убить поток.

...