dispatch_barrier_sync与dispatch_b
2022-08-31 本文已影响0人
Keeping汤
dispatch_barrier_sync 与 dispatch_barrier_async 都是栅栏函数,拦着直至之前的任务执行完,再执行后面的。
注意
函数里面的参数queue 需是自己创建的并行队列,不能是串行,也不能是dispatch_get_global_queue获得的。
dispatch_queue_t que = dispatch_queue_create("myque", DISPATCH_QUEUE_CONCURRENT);
看效果
dispatch_barrier_async
- (void)testBary {
dispatch_queue_t que = dispatch_queue_create("myque", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(que, ^{
NSLog(@"执行1");
});
dispatch_async(que, ^{
NSLog(@"执行2");
});
dispatch_barrier_async(que, ^{
NSLog(@"执行4");
});
//dispatch_barrier_async不会阻碍当前线程的往下执行,所以5被提前执行了
NSLog(@"执行5");
dispatch_async(que, ^{
NSLog(@"执行6");
});
}
执行结果:(”执行5“在前面就执行了)
2022-09-01 22:57:35.075352+0800 asnkjfhew9f[5782:276908] 执行1
2022-09-01 22:57:35.075352+0800 asnkjfhew9f[5782:276793] 执行5
2022-09-01 22:57:35.075400+0800 asnkjfhew9f[5782:276903] 执行2
2022-09-01 22:57:35.075600+0800 asnkjfhew9f[5782:276903] 执行4
2022-09-01 22:57:35.075742+0800 asnkjfhew9f[5782:276903] 执行6
dispatch_barrier_sync
- (void)testBary {
dispatch_queue_t que = dispatch_queue_create("myque", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(que, ^{
NSLog(@"执行1");
});
dispatch_async(que, ^{
NSLog(@"执行2");
});
dispatch_barrier_sync(que, ^{
NSLog(@"完事了,到我执行了3");
});
//dispatch_barrier_sync会阻碍当前线程的往下执行,所以5不会提前执行
NSLog(@"执行5");
dispatch_async(que, ^{
NSLog(@"执行6");
});
}
执行结果:
2022-09-01 23:05:11.200965+0800 asnkjfhew9f[5876:282090] 执行1
2022-09-01 23:05:11.200989+0800 asnkjfhew9f[5876:282095] 执行2
2022-09-01 23:05:11.201289+0800 asnkjfhew9f[5876:282022] 执行3
2022-09-01 23:05:11.201424+0800 asnkjfhew9f[5876:282022] 执行5
2022-09-01 23:05:11.201584+0800 asnkjfhew9f[5876:282090] 执行6