先要知道GCD字面意思是什么,GCD是Grand Central Dispatch的简称(大型中央处理器).
什么是GCD
GCD是放在libdispatch类库中的,为并发代码在多核硬件上执行提供支持。
GCD术语
串行和并发 (Serial vs Concurrent)
任务串行就是每次只有一个任务执行,任务并发就是在同一时间可以有多个任务被执行。
同步和异步 (Synchronous vs Asynchronous)
同步函数只在完成了它的预定任务后才返回。异步函数会立即返回,预定的任务会完成但不会等它完成再返回,所以异步函数不会阻塞当前线程去执行下一个函数。
临界区 (Critical Section)
两个线程不能同时执行同一段代码。两个线程同时改变共享资源时,会导致变量变质。
竞态条件 (Race Condition)
基于特定序列或时机的事件的系统以不受控制的方式运行。
死锁 (Deadlock)
两个线程都卡住了,互相等待对方完成或执行其他操作。
线程安全 (Thread Safe)
线程安全是指代码能够被线程安全的调用,而不会有任何问题。比如 NSDictionary 可以在多个线程中使用它,而NSMutableDictionary 多个线程使用时要保证它的安全,否则会导致它不可信。
并发与并行(Concurrency vs Parallelism)
并发代码以并行的方式执行,这取决于系统。多核系统可以通过并行来同时执行多个线程。单核设备必须先运行一个线程,执行一个上下文切换,然后运行另一个线程,因为太快所以总觉得是并发执行。并行要求并发,并发却不能保证并行。
Queues 队列
首先接下什么是FIFO(First Input First Output的缩写,先入先出队列,这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。)
GCD提供 dispatch queues来处理代码块。这些队列管理任务用FIFO的顺序执行,保证第一个添加的第一个执行,直到终点。
所有的dispatch queues 自身都是线程安全的。
两种调度队列(串行队列和并发队列)
串行队列 (Serial Queues)
任务一次执行一个,只有前一个任务执行完才开始下一个。因为同时只执行一个任务的原因,从竞态条件下保护了临界区。所以保护临界区的唯一方式就是通过提交到调度队列的任务,就不用担心临界区的安全问题了。
并发队列 (Concurrent Queues)
并发队列只能保证会按照添加的顺序开始执行,任务以任意顺序完成,你不知道何时开始下一个任务,完全取决于GCD。GCD来决定在多核和单核上处理任务,来完成任务。
队列类型 (Queues Types)
主队列 (main queue) , 系统提供,串行队列,它能保证所有任务都在主线程执行,而主线程是唯一可用于更新UI的线程。这个队列通常用来发消息给UIView或发送通知。
全局调度队列( Global Dispatch Queues),系统同时提供给你好几个并发队列,目前四个全局队列有不同的优先级:background,low,default,high。
自己可以创建串行队列或并发队列。
网友评论