2015-06-19 3 views
9

Quando sto cercando di regolare di dimensione dello stack di thread:La dimensione dello stack di iPhone è fissa?

- (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; 
} 

nell'output, la dimensione non è cambiato:

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 

è la dimensione dello stack iPhone fisso?

p.s. Sto testando quanto sopra in iPhone 6 Plus, modalità di debug.

UPDATE: la pila può essere regolata durante l'esecuzione nel simulatore su 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

Perché stai cercando di aumentare le dimensioni dello stack? – duncanc4

+0

Sì, penso di sì ... Ho raccolto gli iPhone della mia squadra e ho scoperto che potevo impilarli solo un paio di dozzine circa prima che iniziassero a barcollare a causa del dorso della fotocamera sul retro. – rickster

risposta

2

La dimensione dello stack è delimitata sul dispositivo, e in molti casi non può superare 1 MB per il thread principale su iPhone OS, né può essere ridotto.

La dimensione minima dello stack consentito per i thread secondari è 16 KB e la dimensione dello stack deve essere un multiplo di 4 KB. Lo spazio per questa memoria viene messo da parte nello spazio del processo al momento della creazione del thread, ma le pagine effettive associate a tale memoria non vengono create finché non sono necessarie.

2

In realtà è possibile impostarlo. Non sono sicuro che sia cambiato con iOS 10, ma su iOS 10.2.1 funziona. L'unica limitazione è che la dimensione dello stack deve essere un multiplo di 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

L'utilizzo dell'API NSThread non funziona ancora btw. Funziona solo l'API posix. –