美文网首页
2018-07-13 dispatch_barrier_(a)s

2018-07-13 dispatch_barrier_(a)s

作者: 北你妹的风 | 来源:发表于2018-07-17 08:52 被阅读10次

    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

    相关文章

      网友评论

          本文标题:2018-07-13 dispatch_barrier_(a)s

          本文链接:https://www.haomeiwen.com/subject/svxwpftx.html