前言
- 我们之前大多数都接触过dispatch_barrier_async,这也是GCD提供的解决数据竞争的一种方式,常称作异步栅栏
- 也常通过pthread_rwlock读写锁,来解决数据竞争问题
- 当然,还有很多方式。本文不再讨论如何使用,具体使用大家自行google,而是简洁的讲下dispatch_barrier_async和dispatch_barrier_sync两者的区别,后者可能被很多人都遗忘了
dispatch_barrier_async
- 提交的block,插入到队列后就直接返回
- 提交的block前后的block都按照顺序插入到队列中,执行顺序按照前-barrier-后。
- 注意:这里的执行顺序是同一个队列的任务,如果提交的不是同一个队列,那么barrier的执行顺序对其是无影响
dispatch_barrier_sync
- 只提交barrier和barrier之前的block
- queue等待barrier之前的block执行完,再执行barrier的block,执行完才返回
- 注意:这个阻塞,同时会阻塞一些不是添加到同一队列的任务,因为阻塞导致无法提交,得不到执行
异同
共同点
- 等待前面插入同一队列的任务执行完
- 等待barrier执行完,才执行同一Queue之后的任务
不同点
- sync:自身插入执行完,才返回,插入后续的任务
- async:自身插入,不等待执行完,继续插入后续的任务。等待自身执行完,才执行后续的任务
不等待
aync的不等待(异步)特性体现在将任务插入到队列的过程,它的阻塞等待特性体现在任务真正执行的过程