iOS 并发编程若干问

借用iOS runloop若干问的开场白,鉴于才疏学浅,请各位牛人不吝指教。

1.GCDOperation Queue的区别和联系

GCD和Operation Queue都会负责创线程,调度任务。GCD会把任务添加到dispatch queue,operation queue会把任务添加到operation queue,而且提交到operation queue的是NSOperation对象。



2.dispatch queue是什么?有哪些类型?有什么区别

dispatch queue是基于C的行自定机制,按照先先出的序,串行或并发执行任

有两种dispatch queue,串行dispatch queue,并行dispatch queue。串行一次只能行一个任,直到当前任完成才开始启动下一个任,而并行dispatch queue尽可能多地并发执行。


3.dispatch sources用来干什么?

用来控系事件,是一个基于C的系事件异步理机制。


4.operation objects中控任程有什么法?

KVO


5.NSOperation有哪几种子类,有何区别系?

有NSInvocationOperation和NSBlockOperation。前者基于一个象和selector来建operation object,后者行多个block象。


6.operation并和非并是怎样实现的?

把operation添加到queue中,


7.operation开始行后,如何取消?

iscancelled


8.如果operation之有依,怎解决?

过监测operation的isFinished



9.线程会大量临时的资源,怎样及时释放?

线程中采用autoreleasepool



10.怎样执行operation?

添加一个或一组operation到operation queue,也可以添加block对象。

手动执行operation,要求isReady返回YES,才能调用start方法。



11.系统给应用提供的哪几种并发dispatch queue?怎样获得这些queue?

三种dispatch queue,DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_PRIORITY_HIGH, DISPATCH_QUEUE_PRIORITY_LOW,可以使用dispatch_get_global_queue得到。



12.怎样创建串行dispatch queue?

用dispatch_queue_create创建




13.怎样获得公共queue?

dispatch_get_main_queue,获得主线程关联的串行dispatch queue。

dispatch_get_global_queue,获得并发的queue



14.当创建一个dispatch queue后,怎样释放?



15.怎样异步添加任务到queue?同步呢?

dispatch_async



16。如果dispatch Queue中的任务需要独占访问资源,如何解决?

dispatch semaphore



17。如何使用dispatch source?

首先用dispatch_source_create创建dispatch source,再次为source设置一个事件处理器,例如使用dispatch_source_set_timer设置定时器信息。



18.dispatch source和提交到dispatch queue的一般任务有什么区别?

在执行时间上,当任务提交到dispatch queue后,一般会立即执行,而dispatch source可以把它看作是一个任务,只不过于一般任务的区别在于,dispatch source创建后,并不立即执行,而是当事件发生时,dispatch source会提交block或函数到dispatch queue去执行。


19dispatch source具体怎样实现?

首先,用接口dispatch_source_create创建一个事件源和dispatch source,然后设置事件处理器,例如dispatch_source_set_timer设置定时器,该函数参数分别是dispatch source,事件处理函数或是block,里面是作者自己的逻辑处理。




20.NSOperationQueue可以添加哪些内容?代码怎样实现?

可以添加NSOperation,一组Operations,block对象。

NSOperationQueue* aQueue = [[NSOperationQueue alloc] init];

[aQueue addOperation:anOp]; 

[aQueue addOperations:anArrayOfOps waitUntilFinished:NO];

[aQueue addOperationWithBlock:^{ /* Do something. */}]; 




21。isExecuting和isFinished怎样使用?



22。KVO在NSOperationQUeue中是怎样起作用的?




23。怎样可以实现顺序地执行operation对象?

把operation对象添加到串行operation queue中,用addDependency将两个operation对象之间建立依赖关系。




24。在NSOperation中怎样及时清理不再使用的临时对象?

在main方法中添加autorelease pool,也就是说只要是在多线程中,都要添加autorelease pool以便及时回收内存。



25。当operation对象执行完后,需要做什么工作?

执行完后,需要使用operation中的数据时,你要拥有operation对象的引用,否则operation在执行完后,被删除。



26。怎样使用operation的start方法?




27。当operation执行的工作量都很小,很琐碎时并且operation数量很多时,会出现什么问题? 怎样优化?

过多的调度operation,会浪费资源,降低系统性能。优化方法,尽量增加每个operation的工作量,减少operation的数量。



28。手动执行operation的过程是怎样的?

isready返回YES,调用start而不是main来执行operation



29。什么是单一线程?工作线程?线程池?工作原理各是什么?

单一线程就是创建一个线程执行单一任务,任务完成时释放线程。

工作线程,创建一个或多个线程执行任务,定期分配任务给每个线程。

线程池,创建一个通用的线程池,并为每个线程设置run loop,当要执行一个任务时,从池子中抓取一个线程,并分配任务给它,如果没有空闲线程,任务进入等待队列。

当任务要共享资源时,以上这些不适用。



30。怎样使用queue来取代有锁的thread?

如果任务必须按特定顺序执行,有两种方法,第一种,提交到串行dispatch queue,第二种,使用operation queue,将operation的关系设为dependency。




31。怎样使用dispatch queue实现生产者-消费者?



32。实现异步锁的传统方法怎样?用dispatch queue怎样实现?

传统方法,先得到锁,进行操作,释放锁。




33。dispatch queue什么时候用到同步提交?

当调用dispatch_async,当前线程会被阻塞,直到提交的block执行完毕后,才继续往下执行。




34。run loop一般用来处理异步事件,还有什么办法可以实现这种功能?

dispatch source




dispatch_async,addOperation

dispatch_sync,addDependency



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值