2015-06-19 7 views
9

Kiedy próbuję dopasować rozmiaru stosu wątków:Czy rozmiar stosu iPhone'a jest stały?

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

na wyjściu, wielkość nie ulega zmianie:

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 

jest wielkość iPhone stos stałe?

p.s. Testuję powyższe w iPhone 6 Plus, tryb debugowania.

UPDATE: stos można regulować podczas pracy w symulatorze na MacBooku:

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

Dlaczego próbujesz zwiększyć rozmiar stosu? – duncanc4

+0

Tak, myślę, że ... zebrałem iPhone'y zespołu i stwierdziłem, że mogę je ułożyć tylko na kilkadziesiąt metrów, zanim zaczną balansować z powodu uderzenia kamery w plecy. – rickster

Odpowiedz

2

Wielkość stosu jest ograniczona od urządzenia, a w większości przypadków nie może przekraczać 1MB dla głównego wątku na iPhone OS, ani nie może się skurczyć.

Minimalny dozwolony rozmiar stosu dla wątków dodatkowych wynosi 16 KB, a rozmiar stosu musi być wielokrotnością 4 KB. Przestrzeń dla tej pamięci jest odkładana w przestrzeni procesu w czasie tworzenia wątku, ale rzeczywiste strony powiązane z tą pamięcią nie są tworzone, dopóki nie będą potrzebne.

2

Właściwie możesz to ustawić. Nie jestem pewien, czy to się zmieniło w iOS 10, ale na iOS 10.2.1 to działa. Jedynym ograniczeniem jest to, że rozmiar stosu musi być wielokrotnością 4 kb.

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

Korzystanie z interfejsu API NSThread nadal nie działa btw. Działa tylko interfejs API posix. –

Powiązane problemy