这几天有点时间,就把gcd研究了一下。现把心得和笔记记录如下
gcd常用的api,dispatch_queue_create, 主队列和全局并发队列,dispatch_set_target_queue,dispatch_after,dispatch group,dispatch_barrier_async,dispatch_sync,dispatch_apply,dispatch_suspend/dispatch_resume,dispatch semaphore,dispatch_once,dispath I/O,熟悉gcd常用的api的使用,并清楚知道其适用的业务场景。以前对gcd信号量只是处于了解,这次花了一些时间研究后才算掌握了。同时以前对gcd死锁没有做到透彻的理解,只是一知半解,这次也是完全搞通了。
死锁的心得:死锁的生活中的例子,ABC 3个好朋友一起去车站,来了一辆公交车,结果A说,让B先上车,我紧接着他后面上车;B说,让C先上车,我紧接着他后面上车;C说,让A先上车,我紧接着他后面上车。。所以3个人就永远在互相等另一个人,永远上不了车。。现实中只要A,B,C随便一个人先上车就会打破僵局。但是程序很傻,程序一定会遵守规则,这就是死锁。我的这个例子是现实的例子,更详细的请看这篇文章,我觉得是gcd死锁最好的文章:www.jianshu.com/p/bbabef8aa1fe 。
以前就觉得dispatch_once很牛逼,用它实现单例比static实现单例牛逼几条街,一直想弄明白它是怎么实现的。这次刚好有时间,就研究了一下dispatch_once的实现。参考的文章如下:www.dreamingwish.com/articlelist/tag/gcd
同时对gcd的底层实现有了一些理解,参考资料为上面的链接和Objective-C高级编程的gcd章节,gcd是在iOS和OSX的核心XNU内核级上实现的。gcd中除了dispatch queue外,还有dispatch source,它其实是BSD系内核惯有功能kqueue的包装。dispatch queue提供了暂停和继续api,但是一旦加到队列中,就无法取消。而NSOperationQueue是可以取消的。。dispatch source是可以取消的。。
网友评论