GCD复习

2020-05-28  本文已影响0人  Foxhoundsun

GCD的优势

** GCD 任务和队列**

任务:在线程中执行操作代码,在 GCD 中是放在 block 中的。
执行任务有两种方式:
同步执行(sync)和异步执行(async)。

同步执行(sync)
同步添加任务到指定的队列中,在添加的任务执行结束之前,会一直等待,直到队列里面的任务完成之后再继续执行。
只能在当前线程中执行任务,不具备开启新线程的能力。

异步执行(async)
异步添加任务到指定的队列中,它不会做任何等待,可以继续执行任务。
可以在新的线程中执行任务,具备开启新线程的能力。

队列(Dispatch Queue)
队列指执行任务的等待队列,即用来存放任务的队列。队列是一种特殊的线性表,采用 FIFO(先进先出)

串行队列(Serial Dispatch Queue)
每次只有一个任务被执行。让任务一个接着一个地执行。(只开启一个线程,一个任务执行完毕后,再执行下一个任务)

并发队列(Concurrent Dispatch Queue)
可以让多个任务并发(同时)执行。(可以开启多个线程,并且同时执行任务)

并发队列的并发功能只有在异步(dispatch_async)函数下才有效

GCD 的使用步骤

特别注意

GCD 线程间的通信

在其他线程中先执行任务,执行完了之后回到主线程执行主线程的相应操作

GCD 的其他方法

dispatch_group_notify
监听 group 中任务的完成状态,当所有的任务都执行完成后,才执行dispatch_group_notify block中追加的任务。

dispatch_group_wait
暂停当前线程(阻塞当前线程),等待指定的 group 中的任务执行完成后,才会往下继续执行。
使用dispatch_group_wait 会阻塞当前线程。

dispatch_group_enter、dispatch_group_leave
dispatch_group_enter 标志着一个任务追加到 group,执行一次,相当于 group 中未执行完毕任务数+1

dispatch_group_leave 标志着一个任务离开了 group,执行一次,相当于 group 中未执行完毕任务数-1。

当 group 中未执行完毕任务数为0的时候,才会使dispatch_group_wait解除阻塞,以及执行追加到dispatch_group_notify中的任务。

dispatch_group_enter、dispatch_group_leave组合,其实等同于dispatch_group_async。

GCD 信号量:dispatch_semaphore
GCD中的信号量是指 Dispatch Semaphore,是持有计数的信号。
计数为0时等待,不可通过。
计数为1或大于1时,计数减1且不等待,可通过。

Dispatch Semaphore 提供了三个函数。

注意:信号量的使用前提是:想清楚你需要处理哪个线程等待(阻塞),又要哪个线程继续执行,然后使用信号量。

Dispatch Semaphore 线程同步

线程安全(使用 semaphore 加锁)
semaphore 数为1线程安全加锁

dispatch_semaphore_create 创建一个信号量,传入数字为信号总量。到0位锁
dispatch_semaphore_signal 信号量+1 相当于解锁
dispatch_semaphore_wait 信号量-1 相当于加锁

上一篇 下一篇

猜你喜欢

热点阅读