GCD一些应用的知识点

2017-12-13  本文已影响31人  韩叨叨

本篇各种零散的点,是自己在看教学视频时整理的知识点。

GCD队列

FIFO   
线程安全

在串行队列里dispatch_sync会直接crash (DISPATCH_CLIENT_CRASH)。因为在代码走到这里直接就进入crash,而不会再往下走,进入wait了。

内部临界区: 只能有一个线程或是特定的线程执行的一段代码。

外部临界区:
业务代码不能被两个或多个线程同时执行。(串行队列)

优先级适用不恰当造成


dispatch source

是一个监听某些类型事件的对象,当这些事件发生时,它自动将一个Block放入一个dispatch queue的执行过程中。

source_t time 与 NSTimer 的区别

NSTimer是持有传入的target,用完之后忘记释放的话,会造成内存泄漏。而且是跟runloop相关,有时候会容易触发在不同的runloop会出现不同情况。(NSDefaultRunLoop不会计时)

source_t 就没有那么多问题,比较好用。


隐藏的API

-dispatch_queue_set_width
设置队列宽度,1 为串行;>1 为并行。(系统创建串,并行队列时也是这么创建的)

-dispatch_benchmark
统计代码的执行效率

-dispatch_block_cancel
可以取消一个block


class initialization


AutoreleasePool


RunLoop

====


线程同步

SpinLock

线程通过busy-wait-loop的方式来获取锁,任时刻只有一个线程能够获得锁,其他线程忙等待直到获得锁

问题:产生优先级反转
原则:1、临界区简单,非耗时操作
     2、线程同一优先级
@synchronized
Runloop Source
source 0:
         非基于port,用于用户主动触发事件
         只包含一个回调,并不能主动触发事件,需要先调用CFRunLoopSourceSignal(source),然后手动调用CFRunLoopWeakUp(runloop)唤醒runloop,让其处理。
source 1:
         基于port,用于内核与线程之间通信,包含一个mach_port和一个回调,被用于通过一个内核和其他线程互发消息,可以主动唤醒runloop。

两个APP之间通信

  1. URL
  2. 剪切板
  3. keychain
  4. 服务器中转
  5. source
上一篇下一篇

猜你喜欢

热点阅读