Ограничивает ли OS X использование памяти вторичными потоками? - PullRequest
1 голос
/ 27 августа 2011

Я должен выполнить тяжелую задачу.Когда я запускаю его в главном потоке, все отлично, но когда я пытаюсь запустить задачу из отдельного потока, появляется ошибка: " Нет доступной памяти для программы: небезопасно вызывать malloc".

Я использую +[NSThread detachNewThreadSelector:toTarget:withObject:], и я помещаю необходимый пул авто-релиза, когда это необходимо (то есть, в начале я выделяю и инициализирую его, затем в конце я его истощаю).

Мой вопрос: есть ли ограничение памяти (возможно, стековая память обрезается?) На вторичных потоках?Я попытался отладить с помощью инструментов, однако нет утечки, приложение просто падает.

Ответы [ 3 ]

2 голосов
/ 27 августа 2011

Я не знаю, помогает ли это, но вы можете попробовать использовать очереди вместо NSThreads. ссылка на документацию Apple "Миграция от потоков" .

1 голос
/ 27 августа 2011

Основной поток имеет стек 1 МБ, вторичные стеки имеют размер стека по умолчанию 512 КБ.

Вы получите это сообщение об ошибке, если у вас недостаточно места в стеке, и поскольку оно работает в основном потоке, а не во втором, я бы сказал, что это именно ваша проблема.

Мой первый совет - по возможности уменьшить рекурсию, поскольку 512 КБ достаточно щедро для начала, а увеличение размера, вероятно, только отложит ваши проблемы. Потенциально до тех пор, пока приложение не окажется в руках конечных пользователей, дико рухнувших за 1-звездочные обзоры.

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

NSThread* t = [[NSThread alloc] initWithTarget:self
                                      selector:@selector(someSelector:)
                                        object:anArgument];
[t setStackSize:1024*1024];
[t start];

Минимальный размер стека в 4K, а размер должен быть с шагом 4K.

1 голос
/ 27 августа 2011

Глядя на документацию Apple, вы можете увеличить размер стека, используя -setStackSize:.

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html

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

...