GCD 并发队列来实现多读单写

文章介绍了如何在Objective-C中利用GCD的并发队列和串行队列实现多读单写机制,以确保数据一致性和避免竞争条件。通过定义并发队列读取和串行队列写入,以及使用dispatch_barrier_async函数,实现读写操作的同步控制。

iOS 的多读单写指的是多个线程可以同时读取共享的数据,但是只有一个线程能够写入数据。这是为了保证数据的一致性和避免竞争条件的出现。

一 在 Objective-C 中,可以使用 GCD 的并发队列来实现多读单写。具体实现步骤如下:

1.定义一个并发队列和一个串行队列,用于处理读操作和写操作,分别为 readQueue 和 writeQueue。

dispatch_queue_t readQueue = dispatch_queue_create("com.example.readQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t writeQueue = dispatch_queue_create("com.example.writeQueue", DISPATCH_QUEUE_SERIAL);

2.定义一个全局变量,用于存储共享数据。

NSMutableArray *sharedData = [NSMutableArray array];

3.实现读操作,使用 readQueue 中的异步方法来执行读取操作,这样多个读操作可以同时进行。

- (void)readDataWithCompletion:(void (^)(NSArray *))completion {
    dispatch_async(readQueue, ^{
        NSArray *dataArray = [NSArray arrayWithArray:sharedData];
        dispatch_async(dispatch_get_main_queue(), ^{
            completion(dataArray);
        });
    });
}

4.实现写操作,使用 writeQueue 中的同步方法来执行写入操作,这样保证只有一个线程能够写入数据

- (void)writeData:(id)data {
    dispatch_sync(writeQueue, ^{
        [sharedData addObject:data];
    });
}

通过以上步骤,我们实现了多读单写的功能,多个线程可以同时读取共享数据,但是只有一个线程能够写入数据。这样可以保证数据的一致性和避免竞争条件的出现。注意在 Objective-C 中需要使用 block 来传递回调函数,以及使用 dispatch_get_main_queue() 来将结果回调到主线程。

二  使用 dispatch_barrier_async 函数 并发队列

dispatch_queue_t queue = dispatch_queue_create("com.example.queue", DISPATCH_QUEUE_CONCURRENT);
NSMutableArray *array = [NSMutableArray array];

- (void)write:(id)value {
    dispatch_barrier_async(queue, ^{
        [array addObject:value];
    });
}

- (NSArray *)read {
    __block NSArray *result = nil;
    dispatch_sync(queue, ^{
        result = [array copy];
    });
    return result;
}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值