330,GCD栅栏函数dispatch_barrier使用注意(面试点:dispatch_barrier在串行队列上发挥不了作用,一般配合的是并发队列,栅栏函数不能使用全局队列(global_q...

1、多线程操作同一数据进行 多读单写 线程安全控制;
2、多线程执行不同任务的前后时序控制;

思考一个问题,串行队列还有必要使用dispatch_barrier栅栏函数吗?
很显然,dispatch_barrier在串行队列上发挥不了作用。

因此,dispatch_barrier一般配合的是并发队列。

image.png

你觉得输出结果是?
任务1,任务2随意,任务3一定在任务1,任务2后,任务4一定在任务3后?

不好意思太天真了。
任务1,任务2,任务3,任务4都是随意的。

内心mmp?怎么搞得?

罪魁祸首就是你获取的是系统级别的全局并发队列,
解决办法,自己创建一个自定义的并发队列。
正确的姿势:

image.png

需求: 有4个任务, 需要开启多条线程去执行。 有一个特殊任务0, 需要在1,2任务执行完后, 再执行3, 4任务。

dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);

 

    dispatch_async(queue, ^{

       

        NSLog(@"-------1----%@",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        

        NSLog(@"-------2----%@",[NSThread currentThread]);

    });

 

 

//加入栅栏函数,执行任务0

 

  dispatch_barrier_async(queue, ^{//不能使用全局队列

        

        NSLog(@"barrier");

    });

 

  dispatch_async(queue, ^{

        

        NSLog(@"-------3----%@",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        

        NSLog(@"-------4----%@",[NSThread currentThread]);

    });

栅栏函数: 拦截前面的并发任务, 等待栅栏函数执行完后 ,再执行后面的并发任务。

警告:栅栏函数不能使用全局队列(global_queue)

dispatch_barrier_async 与 dispatch_barrier_sync的区别:

同步栅栏函数会等待栅栏函数内的任务执行完,再执行后面的主线程或者子线程任务。

异步栅栏函数不会等待栅栏函数内任务执行完,就会执行后面主线程的任务。

异步栅栏函数不会阻塞主线程。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容