02-dispatch_barrier

本文深入解析dispatch_barrier_async函数,一种在GCD中用于确保特定任务按顺序执行的机制。通过对比使用与未使用栅栏方法的代码示例,阐述其在数据库访问、文件操作及避免数据竞争中的应用与优势。

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

1 dispatch_barrier_async 概念

栅栏方法,暂时的将一部操作做成一个同步操作,向一个栅栏一样的分开

dispatch_barrier_async函数的作用是在进程管理中起到一个栅栏的作用,它等待所有位于barrier函数之前的操作执行完毕后执行,并且在barrier函数执行之后,barrier函数之后的操作才会得到执行,该函数需要同dispatch_queue_create函数生成的concurrent Dispatch Queue队列一起使用

2 作用

1.实现高效率的数据库访问和文件访问

2.避免数据竞争

3 注意点:
  1. 队列一定不能是全局队列(dispatch_get_global_queue)
  2. 使用自己创建的并发队列(dispatch_queue_create(“read_write_queue”, DISPATCH_QUEUE_CONCURRENT);)
  3. 函数必须为asyn

在前面的任务执行结束后它(栅栏函数)才执行,而且它后面的任务等它执行完成之后才会执行(它前面任务顺序不能控制,它后面的顺序也不能控制)

4 使用
  • 不使用栅栏方法
#import "ViewController.h"

@interface ViewController ()
{
    dispatch_queue_t _queue;
    
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    _queue = dispatch_queue_create("read_write_queue", DISPATCH_QUEUE_CONCURRENT);
    [self read];
    [self read];
    [self write];
}
- (void)read{
    //
    dispatch_async(_queue, ^{
        sleep(1);
        NSLog(@"read");
    });
}
- (void)write
{
    dispatch_async(_queue, ^{
        sleep(1);
        NSLog(@"write");
    });
}

@end
    
// 并发队列异步执行 日志输出时间是一定的
2018-12-12 10:13:19.814352+0800 GCD_Dispatch_Barrier_Demo[3297:42890] read
2018-12-12 10:13:19.814375+0800 GCD_Dispatch_Barrier_Demo[3297:42891] read
2018-12-12 10:13:19.814367+0800 GCD_Dispatch_Barrier_Demo[3297:42892] write
    
    
    
  • 使用栅栏方法,将异步操作暂时变成同步操作

@interface ViewController ()
{
    dispatch_queue_t _queue;
    
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    _queue = dispatch_queue_create("read_write_queue", DISPATCH_QUEUE_CONCURRENT);
    
    [self read];
    [self read];
    [self write];
}
- (void)read{
    //
    dispatch_async(_queue, ^{
        sleep(1);
        NSLog(@"read");
    });
}
- (void)write
{
    // 使用栅栏方法
    dispatch_barrier_async(_queue, ^{
        sleep(1);
        NSLog(@"write");
    });

}

// 日志输出 则write 输出时间延迟1秒执行
2018-12-12 10:16:25.164446+0800 GCD_Dispatch_Barrier_Demo[3372:45243] read
2018-12-12 10:16:25.164445+0800 GCD_Dispatch_Barrier_Demo[3372:45244] read
2018-12-12 10:16:26.168443+0800 GCD_Dispatch_Barrier_Demo[3372:45244] write

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值