多线程运行程序时如果不做一些处理难免会出现对一个属性同时读写的线程安全问题,为了解决此问题,GCD提供了一个
通过用 dispatch barriers 创建一个读者写者锁 优雅的解决方案。
Dispatch barriers 是一组函数,在并发队列上工作时扮演一个串行式的瓶颈。使用 GCD 的障碍(barrier)API 确保提交的 Block 在那个特定时间上是指定队列上唯一被执行的条目。这就意味着所有的先于调度障碍提交到队列的条目必能在这个 Block 执行前完成。
![]()
当这个 Block 的时机到达,调度障碍执行这个 Block 并确保在那个时间里队列不会执行任何其它 Block 。一旦完成,队列就返回到它默认的实现状态。 GCD 提供了同步和异步两种障碍函数。
事例代码如下,将修改数组的代码块放到障碍任务中,当有线程修改数组时,其它携程就不能对其中的代码进行访问(_myQueue是自定义了一个全局的并行队列)
//有障碍——修改数据
- (void)setArrayM2
{
//将修改数据的代码放到障碍任务中
dispatch_barrier_async(_myQueue, ^{
for (int i = 0; i < 10; i++) {
[_arrayM addObject:@(i)];
NSLog(@"设置Array%@",[NSThread currentThread]);
}
});
}
//有障碍——读取数据
- (NSArray *)getArrayM2
{
__block NSArray *array;
dispatch_async(_myQueue, ^{
array = _arrayM;
NSLog(@"读取Array%@",[NSThread currentThread]);
// [NSThread sleepForTimeInterval:1];
NSLog(@"%@",_arrayM);
});
return array;
}