iOS开发

GCD 让线程同步

2020-06-08  本文已影响0人  神奇李白
  • 1.dispatch_group 调度组
  • 2.dispatch_barrier 栅栏块
  • 3.dispatch_semaphore 信号量

dispatch_group 线程组

-分别执行2个耗时的异步操作,等2个异步操作都执行完毕后在回到主线程执行操作,比如下载文件
-关键代码:
1.dispatch_group_notify任务执行完后的通知
2.dispatch_group_wait阻塞当前线程,等上面任务全部执行完后,才会继续
3.dispatch_group_enter 相当于 group 中未执行完毕任务数 +1
4.dispatch_group_leave 相当于 group 中未执行完毕任务数 -1

dispatch_barrier 栅栏快

-在两个操作组间形成栅栏,第一组操作执行完之后,才能开始执行第二组操作
-关键代码:dispatch_barrier_async

dispatch_semaphore信号量

-计数小于 0 时等待,不可通过。计数为 0 或大于 0 时,计数减 1 且不等待,可通过
Eg:异步执行 将 任务 1 追加到队列之后,不做等待,接着执行 dispatch_semaphore_wait 方法,semaphore 减 1,成为-1,进入等待状态。等任务1执行完并dispatch_semaphore_signal信号量+1后,等待中的线程才会继续执行
-关键代码:
1.dispatch_semaphore_create:创建一个 Semaphore 并初始化信号的总量
2.dispatch_semaphore_signal:发送一个信号,让信号总量加 1
3.dispatch_semaphore_wait:可以使总信号量减 1,信号总量小于 0 时就会一直等待(阻塞所在线程),否则就可以正常执行。

Dispatch Semaphore 线程安全和线程同步(为线程加锁)
eg:两个窗口同时出售去成都的票,卖完为止
方法:某个窗口卖的时候,信号量-1,卖出去后信号量+1,信号总量小于0,就能避免另一个窗口卖票!!

上一篇下一篇

猜你喜欢

热点阅读