2012-08-04 2 views
5

В разработке приложений iOS мы используем NSAutoreleasePool, чтобы отказаться от владения объектами в более поздний момент времени.Зачем нам нужно использовать NSAutoreleasepool для каждого потока?

Но почему он может быть разделен между различными потоками?

Почему мы должны создать новый autoreleasepool, когда захочу использовать новый поток?

EDIT:

Как taskinoor упомянул мой вопрос, почему это сконструировано таким образом, что каждый поток должен иметь отдельный autoreleasepool.

+1

[Этот вопрос кажется очень связанным с вашим вопросом] (http://stackoverflow.com/questions/4547652/does-every-thread-need-its-own-autorelease-pool) –

+1

Вы должны подумать об использовании '@ autoreleasepool {...} 'вместо' NSAutoreleasePool'. Согласно документации, она более эффективна. И если вы переходите в ARC, это обязательно. –

+0

Я не знаю, зачем вам это редактирование, мой ответ объясняет причину этого :) –

ответ

5

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

+1

Сделайте это еще на один шаг; если какой-либо поток заблокирован в ожидании чего-либо - сети, состояния потока, другого ввода-вывода - тогда общий пул не может быть истощен. – bbum

0

Я не думаю, что бассейны autorelease разделены между потоками, в соответствии с apples memory management guide в какао каждый поток имеет свой собственный стек autorelease бассейнов

Если вы не создать autorelease пул для нитей, которые вы создаете или detach, то функция автоопределения не работает, поэтому объем памяти будет расти

2

Каждый поток представляет собой другой контекст исполнения: один поток может рано или поздно выйти из системы, они могут использовать разные ресурсы с разными сроками службы и потребностями памяти, поэтому каждый поток должен управляться независимо.

1

Потому что они разработаны таким образом. Я думаю, ваш вопрос в том, почему они так сконструированы. Я не уверен на 100%, но одна из возможных причин может заключаться в том, что совместное использование ресурсов по потокам имеет свои затраты. Во время каждой модификации в общий пул каждый поток должен блокировать-разблокировать то, что уменьшит производительность. Ресурс должен быть разделен на несколько потоков только в том случае, если это разделение необходимо, что не относится к пулам автозапуска. Использование выделенного пула авторесурсов будет работать лучше. Это может быть одной из возможных причин этого дизайнерского решения.

+0

Спасибо Taskinoor – Krishnan

+1

Хорошая догадка, но неполная. Пулы Autorelease должны быть в потоке, потому что не было бы способа безопасно слить пул без * всех потоков *, находящихся в состоянии, когда их пул мог бы быть истощен. Если * любой поток * заблокирован в ожидании ввода, то утечка не может произойти. Ответ Джеффери правильный. – bbum

+1

@bbum, спасибо. Я не думал о том, чтобы слить бассейн, и я согласен с тем, что ответ Джеффри лучше моего. – taskinoor

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