GCD之dispatch_barrier

继续总结和备忘:

  • dispatch_barrier_async函数
    该函数会等待追加到concurrent dispatch queue上的并行执行的处理结束之后,再将指定的处理( dispatch_barrier_async自己携带的代码块任务)追加到该concurrent dispatch queue中。然后在由dispatch_barrier_async函数追加的处理执行完毕之后,concurrent dispatch queue才恢复为一般的动作,追加到该concurrent dispatch queue的处理又开始并行执行;
    dispatch_async(queue, ^{ /*处理1*/  });
    dispatch_async(queue, ^{ /*处理2*/  });
    dispatch_async(queue, ^{ /*处理3*/  });
    dispatch_barrier_async(queue, ^{ /*处理xxx*/  });
    dispatch_async(queue, ^{ /*处理4*/  });
    dispatch_async(queue, ^{ /*处理5*/  });
    dispatch_async(queue, ^{ /*处理6*/  });

这个处理1、2、3会先并行处理完毕,接着处理xxx,xxx处理完毕之后,再接着并行处理4、5、6。

使用concurrent dispatch queue和dispatch_barrier_asyn函数可以实现高效的数据库访问和文件访问。

对应的dispatch_barrier_sync函数,跟dispatch_barrier_async的区别是:
dispatch_barrier_async将自己的任务插入到队列之后,不会等待自己的任务结束,它会继续把后面的任务插入到队列,然后等待自己的任务结束后才执行后面任务;dispatch_barrier_sync将自己的任务插入到队列的时候,需要等待自己的任务结束之后才会继续插入被写在它后面的任务,然后执行它们

  • 简单又不简单的dispatch_async和dispatch_sync
    1. async就是将指定的block任务追加到queue后,dispatch_async函数不做任何等待,继续执行当前线程后续代码。
    2. sync就是在追加指定的block后,dispatch_sync函数会一直等待,直到追加的block结束。
    3. 所以dispatch_sync函数要注意死锁。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容