NSThread setStackSize не устанавливает размер потока

Я использую NSThread и устанавливаю для него размер стека следующим образом:

thread=[[NSThread alloc]initWithTarget:self selector:@selector(fibnocciForLoop) object:nil];
[thread setStackSize:12];
[thread start];    

Как написано в документах Apple для -[NSThread setStackSize:]:

Обсуждение
Вы должны вызвать этот метод перед началом обсуждения. Установка размера стека после запуска потока изменяет размер атрибута (который отражается методом stackSize), но не влияет на фактическое количество страниц, выделенных для потока.

Но когда я позже проверяю размер стека в отладчике, я не получаю установленного значения:

print (int)[thread stackSize]
$1 = 524288

Мой вопрос: почему существует метод setStackSize:, если он ничего не делает?

Пожалуйста, дайте мне знать, где я ошибаюсь, или API для setStackSize: бесполезен?

EDIT: Обратитесь к ответу @Josh Caswell на этот вопрос, я пропустил K в 4K, и, следовательно, приведенный выше код будет работать нормально, как показано ниже:

  thread=[[NSThread alloc]initWithTarget:self
  selector:@selector(fibnocciForLoop) object:nil];
  [thread setStackSize:12*4096];//4K=4096
  [thread start];

ДОПОЛНЕНИЕ ЭТОГО ВОПРОСА:

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

Я хочу знать его точное назначение в NSThread?

Спасибо!


person Aniket K.    schedule 27.06.2012    source источник


Ответы (2)


setStackSize: документации также говорится:

Размер стека для получателя. Это значение должно быть в байтах и ​​кратно 4 КБ.

12 не кратно 4 КБ, поэтому ваш NSThread игнорирует ваши настройки и, вероятно, использует значение по умолчанию, которое составляет 128 страниц (страница в iOS (и OS X) имеет размер 4 КБ) или 4 МБ.

Неясно, что вы хотите, чтобы 12 означало, но вам нужно изменить его, чтобы указать не менее 4096 байтов, если вы хотите, чтобы NSThread использовал вашу настройку.

person jscs    schedule 27.06.2012

Просто прочитав документацию, на которую вы ссылаетесь, пробовали ли вы вызывать [setStackSize:12] после [start]?

thread=[[NSThread alloc]initWithTarget:self selector:@selector(fibnocciForLoop) object:nil];
[thread start]; 
[thread setStackSize:4096]; // multiple of 4KB

Редактировать: хорошо, неважно. Я полностью неправильно прочитал документацию. Не делайте этого.

person OpenUserX03    schedule 27.06.2012
comment
В документах совершенно ясно сказано (OP верен) - и в двух местах - что setStackSize: должен вызываться до start. - person jscs; 27.06.2012