2018-07-13 dispatch_barrier_(a)sync

barrier是栅栏的意思,dispatch_barrier_sync和dispatch_barrier_async 都有类似的功能,即在栅栏操作结束后再执行某些操作。

两者的区别是一个阻塞当前线程,一个不阻塞。

上代码:

 dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);

    dispatch_async(myQueue,^(void){

        NSLog(@"thread1");

    });

    dispatch_async(myQueue,^(void){

        NSLog(@"thread2");

    });

    dispatch_barrier_sync(myQueue, ^{

        NSLog(@"this is barrier");

        [NSThread sleepForTimeInterval:5];

    });

    NSLog(@"hello world");

    dispatch_async(myQueue, ^{

        NSLog(@"thread3");

    });

    dispatch_async(myQueue, ^{

        NSLog(@"thread4");

    });

当使用dispatch_barrier_sync时,程序内容依次执行,加入到队列中的操作也是依次执行。

输出结果:

2018-07-17 08:50:21.532307+0800 NavBarTest[9869:43411] thread1

2018-07-17 08:50:21.532309+0800 NavBarTest[9869:41271] thread2

2018-07-17 08:50:21.532459+0800 NavBarTest[9869:41217] this is barrier

2018-07-17 08:50:26.533880+0800 NavBarTest[9869:41217] hello world

2018-07-17 08:50:26.534185+0800 NavBarTest[9869:43426] thread3

2018-07-17 08:50:26.534192+0800 NavBarTest[9869:41271] thread4



当使用dispatch_barrier_async时,加入到队列中的操作有栅栏效应,但当前程序内容并不受影响,没有被阻塞,所以hello world可能先被执行。

输出结果:

2018-07-17 08:52:37.155288+0800 NavBarTest[9928:44661] hello world

2018-07-17 08:52:37.155288+0800 NavBarTest[9928:44694] thread1

2018-07-17 08:52:37.155290+0800 NavBarTest[9928:44693] thread2

2018-07-17 08:52:37.155551+0800 NavBarTest[9928:44693] this is barrier

2018-07-17 08:52:42.156796+0800 NavBarTest[9928:44694] thread4

2018-07-17 08:52:42.156796+0800 NavBarTest[9928:44693] thread3

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容