GCD栅栏(dispatch_barrier)

上一讲我们将到了GCD单次执行一个方法或者是多次执行一个方法.GCD单次执行与多次执行(disatch_once与dispatch_apply)

这一讲我们讲讲栅栏

栅栏,顾名思义就是把什么东西拦下来的方法.

函数
/// 不带参数
//dispatch_barrier_sync(<#dispatch_queue_t  _Nonnull queue#>, <#^(void)block#>)
//dispatch_barrier_async(<#dispatch_queue_t  _Nonnull queue#>, <#^(void)block#>)

/// 带参数
//dispatch_barrier_sync_f(<#dispatch_queue_t  _Nonnull queue#>, <#void * _Nullable context#>, <#dispatch_function_t  _Nonnull work#>)
//dispatch_barrier_async_f(<#dispatch_queue_t  _Nonnull queue#>, <#void * _Nullable context#>, <#dispatch_function_t  _Nonnull work#>)

根据上面的函数来看.忽略参数问题的话就是一个同步栅栏,一个异步的栅栏.

异步栅栏

dispatch_queue_t queue = dispatch_queue_create("TestQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
	printf("1\n");
});
printf("2\n");
dispatch_barrier_async(queue, ^{
	printf("3\n");
});
printf("4\n");
dispatch_async(queue, ^{
	printf("5\n");
});
printf("~~~\n");

打印结果(就运行了两次)

2 1 4 ~~~ 3 5
2 4 ~~~ 1 3 5

(首先,我这里写的是一个简单的Demo,当前线程是主线程)分析,由于是异步栅栏,那么他就没有阻塞当前线程的执行.而且咱们把任务都放到一个并发线程上去执行的(而且是异步任务).这个栅栏打印的3肯定不会阻拦当前线程的2和4.也就是说2.4的顺序是固定的.先执行2.然后执行4.然后对于栅栏3来讲.因为拦住了1.那么1和5相对于3的位置也是确定的.1在3前面打印.5在3后面打印.其余1可能出现在2前面也可能出现在2后面的分析就不做了.毕竟之前讲同步任务异步任务的时候讲了

同步栅栏

dispatch_queue_t queue = dispatch_queue_create("TestQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
	printf("1\n");
});
printf("2\n");
dispatch_barrier_sync(queue, ^{
	printf("3\n");
});
printf("4\n");
dispatch_async(queue, ^{
	printf("5\n");
});
printf("~~~\n");

打印结果(就运行了两次)

2 1 3 4 ~~~ 5

2 1 3 4 ~~~ 5

可以看出来.同步栅栏阻塞了当前线程.3与之前的1.2未打印的话.4就不会走.

同步栅栏和异步栅栏都能够阻塞队列上的任务,但是最大的区别在于能否阻塞当前线程

异步栅栏带参数(同步栅栏带参数就不说了)

//dispatch_barrier_async(<#dispatch_queue_t _Nonnull queue#>, <#^(void)block#>)

拿出来block发现是下面这个

dispatch_function_t _Nonnull work;

让我们点进去看看dispatch_function_t是啥.

typedef void (*dispatch_function_t)(void *_Nullable);

*dispatch_function_t就是这个函数的名字.所以得出以下定义

void function(void *context) {
    printf("3\n");
}

调用:

NSArray *array = @[@"1" ,@"2"];
dispatch_barrier_async_f(queue, (__bridge_retained void*)array, function);
补充
dispatch_queue_t queue = dispatch_queue_create("TestQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
printf("1\n");
dispatch_async(queue, ^{
	[NSThread sleepForTimeInterval:10];
	printf("1--\n");
	});
});
printf("2\n");
dispatch_barrier_sync(queue, ^{
	printf("3\n");
});
printf("4\n");
dispatch_async(queue, ^{
	printf("5\n");
});
printf("~~~\n");

输出结果

2 1 3 4 ~~~ 5 1 --

和调度组的async和sync函数一样不能阻塞任务里面新开异步任务

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值