GCD—读者写者锁

本文介绍了如何利用GCD的dispatch barriers解决多线程环境下读者写者问题。通过设置障碍任务,确保在修改数组时阻止其他线程的读取操作,以实现线程安全的读写控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多线程运行程序时如果不做一些处理难免会出现对一个属性同时读写的线程安全问题,为了解决此问题,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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值