2018-07-13 dispatch_barrier_(a)s

2018-07-17  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读