2013-04-14 5 views
3

Неплохая практика освобождения памяти от потоков? Таким образом, поток выделяет память и, после выхода, передает указатель на основной поток, чтобы освободить память. Я чувствую, что ответ - да, но мне просто интересно.Освобождение памяти по потокам

Целью этого в моем коде является то, что основной поток может выполнять некоторые другие вещи с памятью, прежде чем освободится. В моем случае есть много обходных решений, с которыми я полностью справляюсь с использованием. Но наличие потока return void * в блок памяти может, в моем случае, сделать код довольно удобным.

EDIT: Я знаю, что при этом нет технических сбоев.

ответ

8

Неправильно, чтобы поток передавал управление памятью, которую он выделил для другого потока. Например, в модели производителя/потребителя было бы очень разумно, чтобы поток производителей выделял память для всего, что она производит, а затем вручную контролирует эту память для потребительского потока для потребительского потока для использования и выпуска.

+0

at 207k, я определенно возьму этот совет haha ​​ – tay10r

+5

Относитесь к 207k как к симптому деменции - ненормальной зависимости от SO. –

+0

Я принимаю ваш ответ, потому что это единственное сообщение, которое отвечает на вопрос в первом предложении. – tay10r

2

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

1

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

4

Это не «плохая практика», если это имеет смысл для вашей модели потока данных и, в частности, для требований вашей программы к жизни объектов, но это может повлечь за собой расходы. Многие современные распределители используют поточно-локальные арены, где выделение и освобождение объекта в одном и том же потоке не требует штрафа за синхронизацию, но освобождение его в другом потоке заставляет синхронизацию или брать на себя другие затраты. По этой причине я бы не изменил ваш дизайн, если это не было основным узким местом, но с учетом этой детали реализации вы могли бы также рассмотреть другие конструкции, например, если поток хранит свой вывод в буфере, предоставленном родительским потоком в аргументе функция запуска потока.

Смежные вопросы