在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
写这一篇总结有些纠结。因为这是一个很大的题目,而我只是为了自己总结一下,没想长篇大论写教程。思来想去,还是写一个备忘录言简意赅吧。 从apple给出的开发指引来看,apple官方是不推荐使用自定义线程的,而是推荐使用block、NSOpration这样的方式进行异步调用。因为内部的实现保证了更好的资源管理。并且给出了创建线程的代价参考。Mac OS和iOS不仅需要为线程分配堆栈空间,而且还需要分配内核空间。这样看起来线程是非常消耗资源的。但是在某些情况下,又必须使用一些特殊的线程创建方式,例如程序结束之前的数据持久化操作,需要创建“可连接”线程(jointable)。这个时候就要用到Posix线程创建方式。 这里是官方给出的线程消耗资源的参考表:
线程创建时间,90毫秒。这个大于多数实例的创建时间。内核数据占用大概1KB的空间,堆栈空间最小16KB,一般都是512KB for iOS/8MB for Mac.这个数据看起来就有点儿狠了。iphone程序创建4、5个现成,就要占去2MB的数据,而iphone一般可用的堆栈空间大概只有100多MB。 不过堆栈空间大小在创建线程的时候是可以设定的: NSThread - 可以调用[[[NSThread alloc] init…] setStackSize:int] 来设置。 POSIX - 设置pthread_attr_t,并使用pthread_attr_setstacksize方法来设置。 Multiprocessing Services - 通过MPCreateTask,传递stackSize参数来设置。
总结一下,有关线程的操作包括:
至于NSTimer、idle Notification,以及异步调用,都属于异步调用的方法。我不认为是作为线程相关功能来总结了。 另外需要关注的是线程调度的问题。 首先是管理线程的结束。在线程结束时获取通知,如果采用轮询的方式非常浪费,我目前了解的至少有三种方法。
有关线程的数据传递,可以通过自定义端口的方式,或者借助NSThread threadDictionary来传递。 然后所以下NSOperation。这是一个内建的线程执行方法。需要定义一个类,集成NSOperation,然后将这个类的实例放入NSOperationQueue中。 @interface MyOp:NSOperation @end @implementation @MyOp -(void)main{ //body... } @end //main NSOperationQueue * queue = [NSOperationQueue new]; MyOp * op = [MyOp new]; [queue addOperation:op]; [queue setMaxConcurrentOperationCount:2];//否则就都是同步按照放入顺序执行 [queue release]; [op release];
最后再说一下block,应该就是GCD支持的方式。 定义一个block: void(^bblock)(void)=^(void){ //body; }
如果要在block中引用某个对象(或变量),这个对象(或变量)必须是声明为static 或者用__block进行了修饰。 __block int blockLocal = 100; static int staticLocal = 100;
另外还有一个方法可以对block进行迭代,那就是block_apply.可以帮助你将循环放入多核支持中。 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; initData(); dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); __block int sum = 0; __block int *pArray = data; // iterations // dispatch_apply(Length, queue, ^(size_t i) { sum += pArray[i]; }); NSLog(@" >> sum: %d", sum); dispatch_release(queue); [pool drain]; 定义好block以后,将它放入queue中进行执行 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, bblock);
block中不能修改 |
请发表评论