当我尝试调整线程的堆栈大小时:
- (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中的上述调试模式。
更新:在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 :(得分:4)
堆栈大小在设备上有限,在大多数情况下,iPhone OS上的主线程不能超过1MB,也不能缩小。
辅助线程允许的最小堆栈大小为16 KB,堆栈大小必须为4 KB的倍数。在创建线程时,您的进程空间中会留出此内存空间,但在需要之前不会创建与该内存关联的实际页面。
答案 1 :(得分: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 ) ;