2015-06-19 8 views
9

Wenn ich versuche, von Stackgröße von Threads anzupassen:Ist die Stapelgröße des iPhone behoben?

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

in der Ausgabe wird die Größe nicht geändert:

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 

die iPhone-Stack-Größe festgelegt ist?

p.s. Ich teste das oben genannte in iPhone 6 Plus, Debug-Modus.

UPDATE: der Stapel kann eingestellt werden, wenn in dem Simulator auf MacBook ausgeführt wird:

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

Warum versuchen Sie, die Stapelgröße zu erhöhen? – duncanc4

+0

Ja, ich denke schon ... Ich habe die iPhones meines Teams eingesammelt und festgestellt, dass ich sie nur ein paar Dutzend hoch stapeln konnte, bevor sie wegen der Kamerabeule auf der Rückseite wippten. – rickster

Antwort

2

Die Stapelgröße begrenzt ist, auf dem Gerät, und in den meisten Fällen nicht 1MB für den Haupt-Thread auf iPhone OS überschreiten kann, noch kann es geschrumpft werden.

Die minimale zulässige Stapelgröße für sekundäre Threads beträgt 16 KB und die Stapelgröße muss ein Vielfaches von 4 KB sein. Der Speicherplatz für diesen Speicher wird in Ihrem Prozessbereich zur Thread-Erstellungszeit reserviert, aber die eigentlichen Seiten, die diesem Speicher zugeordnet sind, werden erst erstellt, wenn sie benötigt werden.

2

Eigentlich können Sie es einstellen. Ich bin mir nicht sicher, ob sich das mit iOS 10 geändert hat, aber auf iOS 10.2.1 funktioniert das. Die einzige Einschränkung ist, dass die Stackgröße ein Vielfaches von 4kb sein muss.

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

Die Verwendung der NSThread-API funktioniert immer noch nicht. Nur die POSIX-API funktioniert. –

Verwandte Themen