GCD之dispatch_barrier_async 解决多线程读写问题

1,174 阅读1分钟

dispatch_barrier_async 函数可以方便的实现多读单写的需求,多线程同时读,但是只能一个线程写操作,并且在写操作完成之后才能继续读.

直接上代码:

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic, strong) NSMutableArray *dataArray;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.dataArray = [NSMutableArray array];
    [self.dataArray addObjectsFromArray:@[@"1",@"2"]];
    [self testBarrierAsync];
}

- (void)testBarrierAsync
{
    //创建一个并行队列
    dispatch_queue_t concurrentQueue = dispatch_queue_create("com.gcd.barrier.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    
    //并行操作
    void (^blk1)(void) = ^{
        NSLog(@"当前的数据====%@",self.dataArray);
    };
    void (^blk2)(void) = ^{
        NSLog(@"当前的数据====%@",self.dataArray);
    };
    void (^blk3)(void) = ^{
        NSLog(@"当前的数据====%@",self.dataArray);
    };
    
    //栅栏函数执行操作
    void (^barrierBlk)(void) = ^{
        [self.dataArray addObject:@"9"];
        [self.dataArray addObject:@"8"];
        
    };
    
    //执行所有操作
    dispatch_async(concurrentQueue, blk1);
    dispatch_async(concurrentQueue, blk3);
    dispatch_barrier_async(concurrentQueue, barrierBlk);
    dispatch_async(concurrentQueue, blk2);
}


@end

从代码里可以看到 前面读取的两次数据是未写入的数据,数组里只是 1,2 两个,当经过写操作的时候,新增了两个数据,后面再次打印这个数组就是最新的数据了

注意点

dispatch_barrier_async 栅栏函数中传入的参数队列必须是由 dispatch_queue_create 方法创建的队列,否则,与dispatch_async无异,起不到“栅栏”的作用了,对于dispatch_barrier_sync也是同理。

其次,读和写要在同一个队列中