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
上一篇 下一篇

猜你喜欢

热点阅读