2015-06-19 1 views
9

Когда я пытаюсь настроить размер стека нитей:Является ли размер стека iPhone фиксированным?

- (void)testStack:(NSInteger)n { 
    NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(dummy) object:nil]; 
    NSUInteger size = 4096 * n; 
    [thread setStackSize:size]; 
    [thread start]; 
} 

- (void)dummy { 
    NSUInteger bytes = [[NSThread currentThread] stackSize]; 
    NSLog(@"%@", @(bytes)); 
} 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Override point for customization after application launch. 
    for (NSInteger i = 126; i <= 130; i++) { 
     [self testStack:i]; 
    } 
    return YES; 
} 

на выходе, размер не меняется:

2015-06-19 11:05:06.912 Stack[52982:2082454] 524288 
2015-06-19 11:05:06.913 Stack[52982:2082457] 524288 
2015-06-19 11:05:06.913 Stack[52982:2082456] 524288 
2015-06-19 11:05:06.913 Stack[52982:2082458] 524288 
2015-06-19 11:05:06.913 Stack[52982:2082455] 524288 

является размер стека iPhone исправить?

p.s. Я тестирую выше в iPhone 6 Plus, режим отладки.

UPDATE: стек можно регулировать при работе в тренажере на MacBook:

2015-06-19 11:25:17.042 Stack[1418:427993] 528384 
2015-06-19 11:25:17.042 Stack[1418:427994] 532480 
2015-06-19 11:25:17.042 Stack[1418:427992] 524288 
2015-06-19 11:25:17.042 Stack[1418:427991] 520192 
2015-06-19 11:25:17.042 Stack[1418:427990] 516096 
+0

Почему вы пытаетесь увеличить размер стека? – duncanc4

+0

Да, я так думаю ... Я собрал iPhones своей команды и обнаружил, что могу только складывать их в пару десятков или так высоко, прежде чем они начнут балансировать из-за удара камеры сзади. – rickster

ответ

2

Размер стека ограничен на устройстве, и в большинстве случаев не может превышать 1 МБ для основного потока на iPhone OS, и не может быть сокращено.

Минимальный допустимый размер стека для вторичных потоков составляет 16 КБ, а размер стека должен быть кратным 4 КБ. Пространство для этой памяти зарезервировано в пространстве процесса при создании потока, но фактические страницы, связанные с этой памятью, не создаются до тех пор, пока они не понадобятся.

2

Фактически вы можете установить его. Я не уверен, что это изменилось с iOS 10, но на iOS 10.2.1 это действительно работает. Единственное ограничение состоит в том, что размер стека должен быть кратным 4kb.

pthread_attr_t tattr; 
int ret = pthread_attr_init (&tattr) ; 
size_t size; 
ret = pthread_attr_getstacksize(&tattr, &size); 
printf ("Get: ret=%d,size=%zu\n" , ret , size) ; 

size = 4096 * 512 ; 
ret = pthread_attr_setstacksize(&tattr, size); 
int ret2 = pthread_attr_getstacksize(&tattr, &size); 
printf ("Set & Get: ret=%d ret2=%d,size=%zu\n" , ret , ret2 , size) ; 
+1

Использование NSThread API по-прежнему не работает. Работает только API-интерфейс posix. –

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